我的问题很简单,但我在文档中找不到任何信息。
当视图从视图层次结构中移除(或移动到另一个视图)时,布局约束会发生什么?
例如,让我们拥有C
带有子视图的容器A
和B
. 容器C
有一些约束。然后我们调用[A removeFromSuperview]
. 的约束会发生什么A
?
如果我们再次添加会发生A
什么C
?
我的问题很简单,但我在文档中找不到任何信息。
当视图从视图层次结构中移除(或移动到另一个视图)时,布局约束会发生什么?
例如,让我们拥有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,您会看到两个不再存在。
这个问题也可以通过界面生成器来证明。当将 a 拖放UIView
到ViewController
添加约束上然后删除时UIView
,您可以看到蓝色约束消失。