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 initWithCoderder der anfängliche Frame festgelegt wurde.
Nun scheint es, dass initWithCoderSie 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 viewDidLayoutSubviewsSie üblicherweise, wenn Sie sich in der Steuerung befinden oder layoutSubviewwenn Sie sich in einer Ansicht befinden. An diesem Punkt (vergessen Sie nicht, die superrelativen 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& UICollectionViewCellUnterklassen layoutSubviewwird 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.