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.
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
ja Entschuldigung, das habe ich verpasst. Guter Punkt –
[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