123

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

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

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

如果我们再次添加会发生A什么C

4

6 回答 6

128

约束被移除。如果再次添加 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];
    }
}
于 2013-09-04T15:44:07.383 回答
48

因为我也有这个问题,所以我检查了 Apple Docs,结果发现约束已被删除。

UIView removeFromSuperview 方法的文档指出:

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

我不确定去年发布原始问题时是否记录了这一点,但我只是想我会分享这些信息以防有人需要它......

于 2015-07-07T22:25:25.277 回答
3

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

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

这在 Mac OS X 上是正确的——我没有检查过 iOS

于 2016-10-10T20:24:48.213 回答
2

约束也被删除,当你[A removeFromSuperview]

他们被遗忘了,再次将 A 添加到 C 不会增加任何约束。

于 2013-09-04T15:44:59.200 回答
0

它们也被删除了,你可以做一个简单的测试。拿起一个视图 SUBVIEW 并创建约束 SUBVIEW 跟随其父视图调整大小的约束(如附加到父视图边缘)。为此,您将 SUBVIEW 作为子视图添加到此 CONTAINERVIEW 并作为约束添加如下内容:
V:|-[SUBVIEW]-|
H:|-[SUBVIEW]-|
这些约束应该被添加到 SUBVIEW 超级视图中,即 CONTAINERVIEW。
如果您通过简单地检查所有 CONTAINERVIEW 约束来删除 SUBVIEW,您会看到两个不再存在。

于 2013-09-04T15:45:12.637 回答
-1

这个问题也可以通过界面生成器来证明。当将 a 拖放UIViewViewController添加约束上然后删除时UIView,您可以看到蓝色约束消失。

于 2017-04-12T14:26:17.017 回答