2015-01-29 11 views
8

Mamy obecnie problem, który tylko wydaje się wpływać na urządzenia iOS7.iOS - viewDidLayoutSubviews wywołane przed ukończeniem automatycznego układu na iOS7

W naszym pliku .xib mamy dwa widoki w widoku kontenera (tzn. Nie na najwyższym poziomie hierarchii widoku), które muszą być okrągłe na ekranie. Widoki mają ograniczenia nałożone na ich położenie i poziomy odstęp w pojemniku, a warunek proporcji wymagający, aby były kwadratowe. Widoki powinny rozszerzać szerokość/wysokość na większych rozmiarach ekranu, z zachowaniem opisanych ograniczeń.

W naszej VC, mamy następujące w viewDidLayoutSubviews zmusić te poglądy pojawiają okrągły:

- (void)viewDidLayoutSubviews { 
    self.progressContentContainerView.layer.cornerRadius = self.progressContentContainerView.frame.size.width/2; 
} 

To wydaje się działać dobrze na systemów iOS 8, jednak na iOS7 jest okres po wyświetleniu widoku gdzie ograniczenia nie zostały jeszcze zastosowane, a rozmiar widoku/widoków jest nieprawidłowy (patrz załączone zrzuty ekranu). To rozwiązuje się i poprawnie renderuje okrąg po pół sekundy. Wydaje się, że dzieje się tak tylko wtedy, gdy widoki, które chcemy okrążyć, NIE są na najwyższym poziomie hierarchii widoków VC, co zdaje się sugerować, że viewDidLayoutSubviews jest wywoływana przed ułożeniem subskrybentów podrzędnych.

Circle with incorrect cornerRadius Circle properly rendered after half a second

Domyślam się, że mogliśmy potencjalnie rozwiązać ten problem przez instacji UIView dla zagnieżdżonego kontenera, dodając odnośniki do okrągłej widzenia w tej podklasy i nadrzędnym viewDidLayoutSubviews tutaj, aby dokonać regulacji cornerRadius. Wydaje się to jednak trochę kłopotliwe i chciałbym zobaczyć, czy są inne opcje.

Czy istnieje bardziej przejrzyste/bardziej idiomatyczne rozwiązanie tego problemu?

+0

Mam podobny problem – d0n13

Odpowiedz

1

wiem, że to jest stare pytanie, ale czy próbowałeś dzwoniąc albo:

[self.progressContentContainerView setNeedsUpdateConstraints]; 

czyli

[self.progressContentContainerView layoutIfNeeded]; 
+0

Wystarczy, aby utrzymać aktywność stycznia roczny żywy - "layoutIfNeeded" było tym, czego szukałem. –

Powiązane problemy