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

时间:2013-09-04 15:31:39

标签: ios autolayout nslayoutconstraint

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

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

例如,让我们的容器C包含子视图AB。容器C拥有一些约束。然后我们打电话给[A removeFromSuperview]A的约束会发生什么?

如果我们再次将A添加到C会怎么样?

6 个答案:

答案 0 :(得分:108)

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

答案 1 :(得分:37)

由于我也遇到过这个问题,因此我检查了Apple Docs只是为了解决问题,结果证明已删除约束。

UIView removeFromSuperview方法的documentation说明:

  

调用此方法将删除引用您的视图的所有约束   正在删除或引用视图子树中的任何视图   正在删除。

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

[A removeFromSuperview]

时也会删除约束

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

答案 4 :(得分:1)

它们也被删除,你可以做一个简单的测试。选取一个视图SUBVIEW并创建约束SUBVIEW的costraints,以跟随其superview大小调整(如附加到superview边缘)。为此,您将SUBVIEW作为子视图添加到此CONTAINERVIEW并添加为类似的约束:
五:| - [子视图] - |
H:| - [子视图] - |
这些约束应该添加到SUBVIEW superview,因此CONTAINERVIEW。
如果您通过简单地检查所有CONTAINERVIEW约束来删除SUBVIEW,您可以看到两个不再存在。

答案 5 :(得分:0)

这个问题也可以通过界面构建​​器来证明。在UIView添加约束时拖放ViewController然后删除UIView,您可以看到蓝色约束消失。