Mit Interface Builder kann der Benutzer jetzt die Größe aller View Controller im Storyboard dynamisch ändern, um die Größe eines bestimmten Geräts zu simulieren.
Vor dieser Funktion sollte der Benutzer jede Größe des Ansichtscontrollers manuell festlegen. Daher wurde der Ansichts-Controller mit einer bestimmten Größe gespeichert, mit initWithCoder
der der anfängliche Frame festgelegt wurde.
Nun scheint es, dass initWithCoder
Sie nicht die im Storyboard definierte Größe verwenden und eine Größe von 1000 x 1000 Pixel für die Viewcontroller-Ansicht und alle ihre Unteransichten definieren.
Dies ist kein Problem, da Ansichten immer eine der folgenden Layoutlösungen verwenden sollten:
Autolayout und alle Einschränkungen ordnen Ihre Ansichten korrekt an
autoresizingMask, mit der jede Ansicht, an die keine Einschränkung gebunden ist, mit einem Layout versehen wird ( beachten Sie, dass die Einschränkungen für Autolayout und Rand jetzt in derselben Ansicht kompatibel sind \ o /! ).
Aber das ist ein Problem für alle Sachen Layout der Ansicht Schicht bezogen, wie cornerRadius
, da weder automatisches Layout noch die automatische Maske auf Schichteigenschaften gilt.
Um dieses Problem zu lösen, verwenden viewDidLayoutSubviews
Sie üblicherweise, wenn Sie sich in der Steuerung befinden oder layoutSubview
wenn Sie sich in einer Ansicht befinden. An diesem Punkt (vergessen Sie nicht, die super
relativen Methoden aufzurufen ) sind Sie sich ziemlich sicher, dass alle Layout-Aufgaben erledigt wurden!
Ziemlich sicher? Hum ... nicht ganz, habe ich bemerkt, und deshalb habe ich diese Frage gestellt. In einigen Fällen hat die Ansicht bei dieser Methode immer noch die Größe 1000x1000. Ich denke, es gibt keine Antwort auf meine eigene Frage. Um die maximale Information darüber zu geben:
1- es passiert nur beim Auslegen von Zellen! In UITableViewCell
& UICollectionViewCell
Unterklassen layoutSubview
wird nicht aufgerufen, nachdem die Unteransichten korrekt angeordnet wurden.
2- Wie @EugenDimboiu bemerkte (bitte stimmen Sie seiner Antwort zu, wenn dies für Sie nützlich ist), wird das Aufrufen [myView layoutIfNeeded]
der nicht angelegten Unteransicht gerade rechtzeitig korrekt angeordnet.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- Meiner Meinung nach ist dies definitiv ein Fehler. Ich habe es beim Radar eingereicht (ID 28562874).
PS: Ich bin kein englischer Muttersprachler, also zögern Sie nicht, meinen Beitrag zu bearbeiten, wenn meine Grammatik korrigiert werden sollte;)
PS2: Wenn Sie eine bessere Lösung haben, schreiben Sie keine weitere Antwort. Ich werde die akzeptierte Antwort verschieben.