删除视图后,约束会发生什么


109

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

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

例如,让我们有C带有子视图A和的容器B。容器C具有一些约束。然后我们打电话[A removeFromSuperview]。约束条件会发生什么A

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

Answers:


118

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

7
可以在文档的某处找到这个事实吗?我相信您,但似乎没有任何地方提及这个事实,这很奇怪。
苏珊(Sulthan)2013年

2
通常将约束与视图一起删除。如果不是,布局系统将如何在以后的评估中对其进行评估?
Mike Pollard 2013年

6
尽管这个答案看起来很明显,但它仍然很有帮助!
race_carr 2014年

1
@pnollet,我不知道为什么那个问题中的发帖人做了他所做的事情。我已记录此日志以进行验证,并且在删除子视图并检查超级视图上的约束时,与删除的子视图有关的那些约束都消失了。
rdelmar

4
@Firo,我确定应该将其删除,因此,如果不在iOS 6中,则可能是错误。顺便说一句,removeFromSuperview方法的文档说:“调用此方法将删除所有引用要删除的视图的约束,或者引用要删除的视图的子树中任何视图的约束”。
rdelmar 2014年

41

由于我也有这个问题,因此我只检查了Apple Docs的踢脚,事实证明,已删除了约束。

UIView removeFromSuperview方法的文档指出:

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

我不确定去年原始问题发布时是否已记录在案,但我只是想分享这些信息,以防万一有人需要它。


真棒感谢来自DOC加入这个直
Esko918

3

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

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

在Mac OS X上是这样-我尚未检查过iOS


有趣!您从哪里获得此信息?addSubview的文档未提及此行为。我问是因为我目前有一个零星的异常,当删除视图控制器时,它指出“无法在视图上安装约束”,这是我没有做的事情。
JimmyB

2

当您 [A removeFromSuperview]

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


0

它们也被删除了,您可以做一个简单的测试。拾取视图SUBVIEW并创建约束SUBVIEW的costraints,以跟随其超级视图调整大小(例如,附着到超级视图边缘)。为此,您可以将SUBVIEW作为子视图添加到此CONTAINERVIEW并添加如下约束:
V:|-[SUBVIEW]-|
H:|-[SUBVIEW]-|
这些约束应添加到SUBVIEW超级视图中,从而添加到CONTAINERVIEW中。
如果仅通过检查所有CONTAINERVIEW约束来删除SUBVIEW,您可能会发现两个约束不再存在。


0

接口构建器也可以证明这个问题。当UIViewViewController添加约束上拖放a 时,删除UIView,您可以看到蓝色约束消失了。


4
情节提要无法证明运行时行为将如何发生。情节提要可以做任何想做的事!
mxcl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.