删除视图时约束会发生什么情况

问题描述 投票:0回答:6

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

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

例如,让我们有容器

C
以及子视图
A
B
。容器
C
有一些限制。然后我们调用
[A removeFromSuperview]
A
的约束会发生什么?

如果我们再次将

A
添加到
C
会发生什么?

ios autolayout nslayoutconstraint
6个回答
130
投票

限制被消除。如果再次添加 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];
    }
}

51
投票

因为我也有这个问题,所以我检查了Apple Docs只是为了好玩,结果发现有记录表明限制已被删除。

UIView removeFromSuperview 方法的文档指出:

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

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


3
投票

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

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

Mac OS X 上也是如此 - 我还没有检查过 iOS


2
投票

当您

[A removeFromSuperview]

时,约束也会被删除

它们被遗忘了,再次将 A 添加到 C 不会增加任何限制。


0
投票

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


-1
投票

这个问题也可以通过接口构建器来证明。当将

UIView
拖放到
ViewController
上时,添加约束然后删除
UIView
,您可以看到蓝色约束消失。

© www.soinside.com 2019 - 2024. All rights reserved.