Teraz Interface Builder pozwala użytkownikowi dynamicznie zmieniać rozmiar każdego kontrolera widoku w scenorysie, aby zasymulować rozmiar określonego urządzenia.
Przed tą funkcją użytkownik powinien ręcznie ustawić każdy rozmiar kontrolera widoku. Więc kontroler widoku został zapisany z określonym rozmiarem, który został użyty initWithCoder
do ustawienia początkowej klatki.
Teraz wygląda na to, że initWithCoder
nie używaj rozmiaru zdefiniowanego w scenorysie i zdefiniuj rozmiar 1000x1000 pikseli dla widoku kontrolera widoku i wszystkich jego podglądów podrzędnych.
Nie stanowi to problemu, ponieważ widoki powinny zawsze używać jednego z następujących rozwiązań układu:
autolayout, a wszystkie ograniczenia będą poprawnie układać widoki
autoresizingMask, która będzie układać każdy widok, do którego nie są dołączone żadne ograniczenia ( uwaga: automatyczne układanie i ograniczenia marginesów są teraz zgodne w tym samym widoku \ o /! )
Ale to jest problem dla wszystkich rzeczy układu związanego z warstwą widoku, jak cornerRadius
, ponieważ ani autolayout ani automatycznej zmiany maska dotyczy właściwości warstw.
Aby odpowiedzieć na ten problem, typowym sposobem jest użycie, viewDidLayoutSubviews
jeśli jesteś w kontrolerze lub layoutSubview
jeśli jesteś w widoku. W tym momencie (nie zapomnij wywołać ich super
względnych metod), jesteś prawie pewien, że wszystko zostało zrobione!
Całkiem pewny? Hum ... nie do końca, zauważyłem, i dlatego zadałem to pytanie, w niektórych przypadkach widok nadal ma rozmiar 1000x1000 w tej metodzie. Myślę, że nie ma odpowiedzi na moje własne pytanie. Aby podać jak najwięcej informacji na ten temat:
1- Dzieje się to tylko podczas układania komórek! W UITableViewCell
& UICollectionViewCell
podklasach, layoutSubview
nie będzie wywoływane po prawidłowym rozmieszczeniu podglądów podrzędnych.
2- Jak zauważył @EugenDimboiu (proszę zagłosuj za jego odpowiedź, jeśli jest dla ciebie przydatna), wywołanie [myView layoutIfNeeded]
nie- ułożonego podglądu podrzędnego spowoduje prawidłowe ułożenie go w samą porę.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel);
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel);
}
3- Moim zdaniem jest to zdecydowanie błąd. Wysłałem to na radar (id 28562874).
PS: Nie jestem Anglikiem, więc nie krępuj się edytować mojego posta, jeśli moja gramatyka powinna zostać poprawiona;)
PS2: Jeśli masz jakieś lepsze rozwiązanie, nie wahaj się pisać kolejnej odpowiedzi. Przesunę zaakceptowaną odpowiedź.