我的问题很简单,但我在文档中找不到任何信息。
从视图层次结构中删除视图(或移动到另一个视图)时,布局约束会发生什么?
例如,让我们有容器
C
以及子视图 A
和 B
。容器C
有一些限制。然后我们调用[A removeFromSuperview]
。 A
的约束会发生什么?
如果我们再次将
A
添加到 C
会发生什么?
限制被消除。如果再次添加 A,则必须为其创建新的约束,或者如果在删除 A 之前保存约束,则可以将它们添加回来。当我做这样的事情时,我将这样的约束保存到名为 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];
}
}
因为我也有这个问题,所以我检查了Apple Docs只是为了好玩,结果发现有记录表明限制已被删除。
UIView removeFromSuperview 方法的文档指出:
调用此方法会删除引用您的视图的任何约束 正在删除,或者引用您要删除的视图的子树中的任何视图 正在移除。
我不确定去年发布原始问题时是否记录了此信息,但我只是想分享此信息以防有人需要......
但请注意,如果您有两个独立的父视图 A 和 B,以及一个子视图 C,其中 C 当前是 A 的子视图,并且具有适当的约束,则调用 [B addSubview:C] 将不会清除与A 和 C 以及自动布局将开始抛出异常,因为这些约束不再与同一层次结构中的视图相关。
在将 C 添加到 B 之前,您需要显式调用 [C removeFromSuperview] 来删除约束。
Mac OS X 上也是如此 - 我还没有检查过 iOS
当您
[A removeFromSuperview]
时,约束也会被删除
它们被遗忘了,再次将 A 添加到 C 不会增加任何限制。
它们也被删除了,你可以做一个简单的测试。选择一个视图 SUBVIEW 并创建约束 SUBVIEW 遵循其父视图大小调整的约束(如附加到父视图边缘)。为此,您将 SUBVIEW 作为子视图添加到此 CONTAINERVIEW 中,并添加类似的约束:
V:|-[SUBVIEW]-|
H:|-[SUBVIEW]-|
这些约束应该添加到 SUBVIEW 超级视图,即 CONTAINERVIEW。
如果您通过简单地检查所有 CONTAINERVIEW 约束来删除 SUBVIEW,您会发现其中两个不再存在。
这个问题也可以通过接口构建器来证明。当将
UIView
拖放到 ViewController
上时,添加约束然后删除 UIView
,您可以看到蓝色约束消失。