2013-07-05 9 views

Odpowiedz

14

updateViewConstraints jest wywoływana przez viewWillLayoutSubviews (za pośrednictwem metody widoku layoutSubviews po drodze). Jak sama nazwa wskazuje, jest to nazywane za każdym razem, gdy kontroler widoku potrzebuje zaktualizować swój układ.

Jeżeli uznając, że updateViewConstraints jest nigdy miano to należy upewnić się, że dzwonisz metod super Pana zdaniem regulatora, gdzie wymagane.

Wygląda na to, że jesteś tworząc swoje ograniczenia wewnątrz updateViewConstraints? To może być również przyczyną twojego problemu. Powinieneś aktualizować swoje ograniczenia w tej metodzie, nie tworząc ich (w taki sam sposób, jak w pozycjach layoutSubviews ustawiasz swoje poglądy, ale ich nie tworzysz).

+1

Nadal nie jestem pewien, dlaczego updateViewConstraints nie jest wywoływana w niektórych moich kontrolerach widoku ... Nie jestem pewien, kiedy oczekiwać, że zostanie wywołany lub gdy nie będzie. – topwik

+0

Czy * zdecydowanie * dodajesz ograniczenia widoku poza 'updateViewConstraints' (tj. W' viewDidLoad' lub podobnym). – lxt

+12

Dokumentacja mówi: "Możesz zastąpić tę metodę w podklasie, aby dodać ograniczenia do widoku lub jego podobrazów.". Tak więc wydaje się całkiem fajnie tworzyć ograniczenia w updateConstraints: w przypadku, gdy musisz drastycznie zmienić interfejs. – Andy

4

tylko przypuszczenie, a nie 100% pewne:

updateViewConstraints nie zostanie wywołana, jeśli Państwa zdaniem kontrolerów widok korzeń nie wymaga układ automatycznego. Więc trzeba dodać przynajmniej jedno ograniczenie do widoku głównego (gdzieś w loadview lub viewDidLoad) lub ustawić

self.view.translatesAutoresizingMaskIntoConstraints = NO; 

ta powinna wyzwalać swój punkt załamania.

+0

Myślę, że to powinna być poprawna odpowiedź. Nie trzeba wywoływać setNeedsUpdateConstraints. gdy widok ładuje updateViewononions powinien automatycznie zostać wywołany. Ponadto możemy tworzyć ograniczenia w updateViewonions, nie ograniczając się tylko do aktualizacji ograniczeń. – posha

13

Jesteś ViewController i chcesz system zadzwonić updateViewConstraints, potem trzeba nazwać

[self.view setNeedsUpdateConstraints]; 
+1

W moim przypadku dodałem myView jako bezpośrednie wyeksponowanie self.view. Ponieważ self.view nie jest domyślnie włączonym układem automatycznym, [self.view setNeedsUpdateConstraints] nie działa, ale działa [self.myView setNeedsUpdateConstraints] - wyzwalając metodę updateConstraints myView. – Donald

10

Twój UIView musi wdrożyć + (BOOL)requiresConstraintBasedLayout i powrócić YES. W takim przypadku updateViewConstraints będzie początkowo wywoływany do ustawiania ograniczeń.

+1

Z tego co wiem, jest prawie poprawne.Jeśli UIView (lub jeden z jego podrzędnych) z UIViewController zwraca TRUE dla + wymagaConstraintBasedLayout to kontroler widoku będzie uczestniczyć w konfiguracji układu automatycznego przez wywołanie -updateViewConstraints. –