Was passiert mit Einschränkungen, wenn eine Ansicht entfernt wird?

108

Die Frage, die ich habe, ist einfach, aber ich konnte keine Informationen in der Dokumentation finden.

Was passiert mit Layouteinschränkungen, wenn eine Ansicht aus der Ansichtshierarchie entfernt (oder in eine andere Ansicht verschoben) wird?

CNehmen wir zum Beispiel einen Container mit Unteransichten Aund B. Container Centhält einige Einschränkungen. Dann rufen wir an [A removeFromSuperview]. Was passiert mit den Einschränkungen für A?

Was dann passiert , wenn wir hinzufügen , Aum Cwieder?

Sulthan
quelle

Antworten:

118

Die Einschränkungen werden entfernt. Wenn Sie A erneut hinzufügen, müssen Sie neue Einschränkungen dafür vornehmen. Wenn Sie die Einschränkungen speichern, bevor Sie A entfernen, können Sie sie wieder hinzufügen. Wenn ich so etwas mache, speichere ich die Einschränkungen wie folgt für eine Ansicht namens view1:

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}
rdelmar
quelle
7
Kann diese Tatsache irgendwo in der Dokumentation gefunden werden? Ich glaube dir, aber es scheint seltsam, dass die Tatsache nirgendwo erwähnt wird.
Sulthan
2
Es ist normal, dass die Einschränkungen zusammen mit der Ansicht wirklich entfernt werden. Wenn dies nicht der Fall wäre, wie könnte das Layoutsystem sie in einem zukünftigen Durchgang bewerten?
Mike Pollard
6
So offensichtlich diese Antwort auch sein mag, sie war dennoch enorm hilfreich!
Race_Carr
1
@pnollet, ich weiß nicht, warum das Poster in dieser Frage das getan hat, was er getan hat. Ich habe dies protokolliert, um zu überprüfen, und wenn ich eine Unteransicht entferne und die Einschränkungen in der Übersicht überprüfe, sind die Einschränkungen, die sich auf die entfernte Unteransicht beziehen, weg.
Rdelmar
4
@Firo, ich bin sicher, dass sie entfernt werden sollen. Wenn sie also nicht in iOS 6 sind, ist es wahrscheinlich ein Fehler. Übrigens lautet das Dokument für die Methode removeFromSuperview: "Durch Aufrufen dieser Methode werden alle Einschränkungen entfernt, die sich auf die zu entfernende Ansicht oder auf eine Ansicht im Teilbaum der zu entfernenden Ansicht beziehen."
Rdelmar
40

Da ich auch diese Frage hatte, überprüfte ich die Apple Docs nur auf Tritte und es stellte sich heraus, dass dokumentiert ist, dass die Einschränkungen entfernt wurden.

In der Dokumentation zur UIView removeFromSuperview-Methode heißt es:

Durch Aufrufen dieser Methode werden alle Einschränkungen entfernt, die sich auf die zu entfernende Ansicht oder auf eine Ansicht im Teilbaum der zu entfernenden Ansicht beziehen.

Ich bin mir nicht sicher, ob dies letztes Jahr dokumentiert wurde, als die ursprüngliche Frage veröffentlicht wurde, aber ich dachte nur, ich würde diese Informationen weitergeben, falls jemand sie benötigt ...

Evan Stone
quelle
Super danke, dass
du
3

Beachten Sie jedoch, dass der Aufruf von [B addSubview: C] bei zwei unabhängigen übergeordneten Ansichten A und B und einer Unteransicht C, wobei C derzeit eine Unteransicht von A mit entsprechenden Einschränkungen ist, KEINE Einschränkungen in Bezug auf A aufhebt und C, und das automatische Layout löst Ausnahmen aus, da sich diese Einschränkungen nicht mehr auf Ansichten in derselben Hierarchie beziehen.

Sie müssen [C removeFromSuperview] explizit aufrufen, um die Einschränkungen zu entfernen, bevor Sie C zu B hinzufügen.

Dies gilt unter Mac OS X - Ich habe iOS nicht überprüft

Martin Redington
quelle
Interessant! Woher haben Sie diese Informationen? In den Dokumenten für addSubview wird dieses Verhalten nicht erwähnt. Ich frage, weil ich derzeit eine sporadische Ausnahme beim Entfernen eines Ansichts-Controllers habe, die besagt, dass die Einschränkung für die Ansicht nicht installiert werden kann - etwas, das ich nicht tue.
JimmyB
2

Die Einschränkungen werden auch entfernt, wenn Sie [A removeFromSuperview]

Sie werden vergessen und durch erneutes Hinzufügen von A zu C werden keine Einschränkungen hinzugefügt.

Mike Pollard
quelle
0

Sie werden ebenfalls entfernt, Sie können einen einfachen Test durchführen. Nehmen Sie eine Ansicht SUBVIEW auf und erstellen Sie Kostenbeschränkungen, die SUBVIEW dazu zwingen, die Größe der Superview zu ändern (z. B. an den Kanten der Superview angebracht). Dazu fügen Sie SUBVIEW als Unteransicht zu dieser CONTAINERVIEW hinzu und fügen als Einschränkungen etwa Folgendes hinzu:
V: | - [SUBVIEW] - |
H: | - [SUBVIEW] - |
Diese Einschränkungen sollten zur SUBVIEW-Übersicht hinzugefügt werden, also zur CONTAINERVIEW.
Wenn Sie SUBVIEW entfernen, indem Sie einfach alle CONTAINERVIEW-Einschränkungen überprüfen, können Sie feststellen, dass zwei nicht mehr vorhanden sind.

Andrea
quelle
0

Diese Frage kann auch vom Interface Builder bewiesen werden. Wenn Sie a UIViewauf die ViewControllerAdd Constraints ziehen und dort ablegen und dann entfernen UIView, werden die blauen Constraints ausgeblendet.

William Hu
quelle
4
Das Storyboard beweist nichts darüber, wie das Laufzeitverhalten auftreten wird. Storyboard kann machen was es will!
mxcl