删除视图时约束的情况

我的问题很简单,但我在文档中找不到任何信息。

当视图从视图层次结构中移除(或移动到另一个视图)时,布局约束会发生什么情况?

例如,让我们使用带有子视图 AB的容器 C。容器 C包含一些约束。然后我们调用 [A removeFromSuperview]A的约束发生了什么?

如果我们再次把 A加到 C,会发生什么?

24555 次浏览

约束被移除。如果再次添加 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];
}
}

[A removeFromSuperview]时,约束也被移除

它们被遗忘了,并且再次将 A 添加到 C 中不会添加任何约束。

他们也被删除了,你可以做一个简单的测试。选择一个视图 SUBVIEW,并创建约束 SUBVIEW 遵循其超视图调整大小的约束(如附加到超视图边缘)。为此,您可以将 SUBVIEW 作为子视图添加到这个 CONTAINERVIEW,并添加类似于下面这样的约束:
维: |-[ SUBVIEW ]-|
H: |-[ SUBVIEW ]-|
这些约束应该添加到 SUBVIEW 超视图,因此是 CONTAINERVIEW。
如果您通过简单地检查所有 CONTAINERVIEW 约束来删除 SUBVIEW,那么您可以看到两个约束已经不存在了。

因为我也有这个问题,所以我检查了苹果文档,只是为了好玩,结果证明文档中的约束被移除了。

UIView RemoveFromSuperview 方法的 文件指出:

调用此方法将移除引用您的视图的任何约束 正在移除,或者引用视图子树中的任何视图 正在移除。

我不确定这是不是去年发布原始问题时的记录,但我只是觉得我应该分享这些信息,以防有人需要..。

但是请注意,如果你有两个独立的父视图 A 和 B,以及一个子视图 C,其中 C 目前是 A 的子视图,有适当的约束,调用[ B addSubview: C ]将不会清除任何与 A 和 C 相关的约束,自动布局将开始抛出异常,因为这些约束不再涉及相同层次结构中的视图。

在将 C 添加到 B 之前,需要显式调用[ C RemoveFromSuperview ]来删除约束。

这在 Mac OS X 上是真的——我还没有检查 iOS

这个问题也可以用 Interface Builder 来证明。当在 ViewController上拖放一个 UIView添加约束然后移除 UIView时,您可以看到蓝色约束消失了。