2015-02-01 14 views
10

Podczas korzystania z automatycznego układu w serii ujęć istnieje opcja, aby zachować ograniczenie, czy nie, przy użyciu opcji "Zainstalowane". Wyłączenie go spowoduje, że zachowa się tak, jakby nie dodać tego ograniczenia - nie będzie to miało żadnego efektu. Możesz skonfigurować stan instalacji dla różnych klas wielkości w Kreatorze interfejsów i możesz zmienić tę wartość programowo, ustawiając jej właściwość active na true lub false.Gdzie zmienić "zainstalowany" dla ograniczenia automatycznego układu?

W mojej aplikacji chcę, aby ograniczenie było instalowane tylko wtedy, gdy urządzenie jest w portretie - powinno zostać "odinstalowane" podczas obracania do pejzażu. Można to zrobić dla iPhone'ów odznaczając zainstalowane dla dowolnej wysokości kompaktowej. (Wydaje się, że nie działa to całkiem poprawnie, ponieważ łamie to ograniczenie ze względu na sprzeczne ograniczenia podczas obracania do pejzażu, gdy nie powinno być nawet instalowane, ale niezależnie od tego, czy interfejs użytkownika zawsze pojawia się zgodnie z oczekiwaniami.) Ale nie ma sposobu, aby odinstalować ograniczenie dla iPada w krajobrazie w Interface Builder (regularna szerokość regularnej wysokości w obu orientacjach).

Gdzie jest właściwe miejsce do włączania/wyłączania active dla NSLayoutConstraint s podczas obracania urządzenia? W jakiej metodzie rotacji zmiana tego stanu spowoduje pożądane zachowanie - instaluje się tylko w przypadku portretu? Jeśli ta metoda nie zostanie wywołana podczas uruchamiania aplikacji, w jakiej innej metodzie należy ją umieścić oprócz metody rotacji?

Próbowałem umieszczając poniższy kod w viewDidLoad i viewWillTransitionToSize ale to powoduje pewne nieoczekiwane zachowanie podczas jazdy na iPada:

  • Uruchamianie aplikacji w krajobrazie powoduje ograniczenie być aktywny, mimo aktywnej ustawiono wartość "fałsz", powoduje to zerwanie ograniczenia, a interfejs użytkownika nie jest wyświetlany zgodnie z oczekiwaniami.
  • Uruchamianie aplikacji w zestawach portretów aktywnych do wartości true (było już zainstalowane w IB), więc działa zgodnie z oczekiwaniami.
  • Uruchamianie aplikacji w pionie i obracając urządzenie do pejzażu działa zgodnie z oczekiwaniami - ograniczenie jest ustawione na nieaktywne, nie łamie ograniczenia, interfejs użytkownika pojawia się zgodnie z oczekiwaniami
  • Uruchamianie aplikacji w pionie, obracanie do orientacji poziomej i powrót do portretu powoduje, że interfejs jest wyświetlany poprawnie, ale przerywa to ograniczenie, które jest ustawione na aktywne:

Jeśli odinstaluję ograniczenie w programie Interface Builder, a następnie wykonam powyższe scenariusze, otrzymam zasadniczo przeciwne zachowanie.

if size.width > size.height { 
    self.myConstraint.active = false 
} else { 
    self.myConstraint.active = true 
} 

Odpowiedz

0

jestem trochę późno, by odpowiedzieć, ale tutaj jest moje 2 centy, kiedy wychodził podobny problem do rozwiązania problemu niemożności autoLayout do wykrywania Compact szerokość/wysokość Compact dla iPhone z iOS 7. W iOS 7 nie ma właściwości activated, więc musiałem je dodać/usunąć.

Utworzono dwie metody dodawania i usuwania wiązań, a ograniczenia te są już ustawione na IB i odwołuję się do nich właściwościami IBOutlet. Więc odkąd je usuwam, w przeciwieństwie do innych obiektów IB, powinienem ustawić je na strong, a nie weak. W przeciwnym razie po ich usunięciu zostaną one zniszczone i nie będę mógł ich ponownie przywołać, aby ponownie je dodać.

Oto moja metoda usuwania ograniczenia:

-(void)removeiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(!UIInterfaceOrientationIsLandscape(toInterfaceOrientation)&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)){ 
     // if iPhone with iOS 7 on portrait remove Constraints here 

    } 
} 

i tutaj jest metoda ograniczenia żmija:

-(void)addiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)){ 
     // if iPhone with iOS 7 on landscape add Constraints here 

    } 

} 

Jak dla gdzie zadzwonić do tych metod, jak próbował, zadzwoń oboje w viewWillAppear (nie trzeba wywoływać viewWillDisappear) i viewWillTransitionToSize (w moim przypadku jest to willRotateToInterfaceOrientation, ponieważ viewWillTransitionToSize jest dostępny tylko po iOS 8). Nazwanie ich później ma sens, w końcu tylko jeden z nich zostanie uruchomiony z powodu sprawdzenia orientacji pionowej/poziomej przy pomocy if, przed wprowadzeniem koniecznych zmian.

i tu jest moja definicja willRotateToInterfaceOrientation metoda:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    // this will be run only if orientation is on Portrait 
    [self addiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation]; 

    // this will be run only if orientation is on Landscape 
    [self removeiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation]; 
} 

i zrobić podobną rozmowę w viewWillAppear.

UWAGA: upewnij się, że robisz dokładnie odwrotnie w tych metod, a nie koniecznie dodać ograniczenia tylko w addConstraintMethod i usunąć tylko w removeConstraintMethod. W moim przypadku zarówno dodam, jak i usuwam ograniczenia w każdym z nich, więc nazwy metod nie odzwierciedlają dokładnie ich roli, ale tak długo, jak robisz dokładnie przeciwieństwa, do których jesteś dobry.

Powiązane problemy