2013-06-21 10 views
9

Wenn ich automatisches Layout verwende, verstehe ich das Entfernen einer Unteransicht (während ich natürlich einen Verweis darauf halte), die entfernte Unteransicht kennt immer noch ihre automatischen Layout-Einschränkungen.Entfernen und erneutes Hinzufügen einer Unteransicht mit automatischem Layout

Wenn die Subview die Super View jedoch später wieder hinzufügt, kennt sie ihre Frame-Größe nicht mehr. Eher scheint es, einen Nullrahmen zu bekommen.

Ich nahm an, dass Auto-Layout automatisch Größe, um die Einschränkungen zu erfüllen. Ist das nicht der Fall? Ich dachte Auto-Layout bedeutet nicht mit Frame-Rect. Muss ich beim Hinzufügen der Unteransicht immer noch den Anfangsrahmen korrigieren, selbst bei automatischem Layout?

Antwort

16

Beim Entfernen der Unteransicht gehen alle Einschränkungen verloren, die sich auf diese Unteransicht beziehen. Wenn Sie die Unteransicht später erneut hinzufügen müssen, müssen Sie dieser Unteransicht erneut Einschränkungen hinzufügen.

Normalerweise erstelle ich die Einschränkungen in meiner benutzerdefinierten Unteransicht. Zum Beispiel:

-(void)updateConstraints 
{ 
    if (!_myLayoutConstraints) 
    { 
     NSMutableArray *constraints = [NSMutableArray array]; 

     // Create all your constraints here 
     [constraints addWhateverConstraints]; 

     // Save the constraints in an ivar. So that if updateConstraints is called again, 
     // we don't try to add them again. That would cause an exception. 
     _myLayoutConstraints = [NSArray arrayWithArray:constraints]; 

     // Add the constraints to myself, the custom subview 
     [self addConstraints:_myLayoutConstraints]; 
    } 

    [super updateConstraints]; 
} 

updateConstraints wird automatisch durch die Automatische Anordnung Laufzeit aufgerufen werden. Der obige Code wird in Ihre benutzerdefinierte Unterklasse UIView übernommen.

Sie haben recht, dass Sie bei der Arbeit mit Autolayout keine Rahmengrößen berühren möchten. Aktualisieren Sie stattdessen die Einschränkungen in updateConstraints. Oder, noch besser, richten Sie die Einschränkungen so ein, dass Sie nicht müssen.

Siehe meine Antwort zu diesem Thema:

Autolayout UIImageView with programatic re-size not following constraints

Sie brauchen nicht den anfänglichen Rahmen zu setzen. Wenn Sie initWithFrame verwenden, setzen Sie es einfach auf CGRectZero. Ihre Einschränkungen werden - in der Tat müssen - Detail entweder wie groß etwas sein sollte, oder andere Beziehungen, die die Laufzeit bedeuten, kann die Größe ableiten.

Zum Beispiel, wenn Ihr visuelles Format ist: @"|-[myView]-|", das ist alles, was Sie für die horizontale Dimension benötigen. Auto-Layout wird wissen, um myView bis zu den Grenzen der Eltern superview mit der Bezeichnung |. Es ist ziemlich cool.

+1

Danke. Das ist schön und klar. Eine Anmerkung, die ich über Kakao und nicht Cocoa-Touch gefragt, aber für andere zu beachten, die APIs sind gleich oder fast gleich (wie von Peter Ammon ofApple beschrieben). Die Ansätze in beiden Welten sollten gleich sein. – uchuugaka

+1

ja Entschuldigung, das habe ich verpasst. Guter Punkt –

+1

[Die Dokumentation] (https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) sagt, dass es ** wichtig **, um '[super updateConstraints]' als letzten Schritt in Ihrer Implementierung zu nennen. Es sollte am Ende Ihrer Methode gehen, nicht am Anfang. – Eric

Verwandte Themen