Beim programmatischen Erstellen von Layouts befolge ich Apples Ratschlag: override -updateConstraints, füge benutzerdefinierte Einschränkungen hinzu und fange setNeedsUpdateConstraints ein, sobald Subviews zur Ansicht hinzugefügt wurden. Mein typischer Aufbau sieht wie folgt aus:Autolayout und programmatische Einschränkungen: Wie behandelt man updateConstraints mehrere Male?
- (void)setupViews
{
//Style View
//Add gesture recognizers
//Add Subviews
[self setNeedsUpdateConstraints];
}
- (void)updateConstraints
{
//Add custom constraints
[super updateConstraints];
}
Das Problem
Es gibt Gelegenheiten, bei denen -updateConstraints mehrmals gefeuert wird (zum Beispiel, wenn ein Controller Ansicht w/Animation präsentiert oder geschoben). Das Problem hierbei ist, dass jede hinzugefügte Bedingung neu hinzugefügt wird. Dies wird zu einem ernsthaften Problem, wenn versucht wird, auf Anforderung die Konstante einer hinzugefügten Beschränkung zu ändern, da zwei der ursprünglichen Bedingungen in der Folge miteinander in Konflikt stehen. Ich stelle mir vor, dass du, selbst wenn du die Beschränkungen nicht manipulierst, nachdem du sie erstellt hast, doppeltes hast, was dir nicht gut erscheint.
Mögliche Lösungen
1 - alle Einschränkungen Entfernen Sie die Ansicht zu bewirken, bevor sie in -updateConstraints Anwendung:
- (void)updateConstraints
{
//Remove all constraints affecting view & subviews
//Add custom constraints
[super updateConstraints];
}
2 - Legen Sie ein Layout-Flag & Prüfung gegen sie vor benutzerdefinierten Einschränkungen hinzu:
- (void)updateConstraints
{
if (self.didAddConstraints) {
[super updateConstraints];
return;
}
//Add custom constraints
self.didAddConstraints = YES;
[super updateConstraints];
}
3 - Machen Sie sich keine Sorgen über die Verdoppelung der Beschränkungen, und Wenn eine Konstante geändert werden muss, entfernen Sie diese Einschränkung nur, bevor Sie sie erneut hinzufügen.
3 - Etwas tolles, an das ich nicht gedacht habe.
Was ist die beste Praxis hier?
Ich denke, Sie könnten 'setNeedsUpdateConstraints' und' updateConstraints' missbrauchen. Sie haben das Aktualisieren von Konstanten erwähnt - in diesem Fall brauchen Sie nur 'setNeedsLayout'. Mein Verständnis ist, dass "updateConstraints" für Großhandelsänderungen am Layout gedacht ist - wenn Sie die Struktur der Ansicht ändern, nicht nur Parameter. Es ist vorgesehen, einen Platz/Zeit zu haben, um die Beschränkungen dramatisch zu ändern, um eine Änderung der Aktualisierung nach kleinen Zustandsänderungen zu vermeiden.Das heißt, in der State-Eigenschaft Einstellungscode, aktualisieren Sie auch die spezifische entsprechende Einschränkung, und rufen Sie setNeedsDisplay. –