我的问题很简单,但我在文档中找不到任何信息。
从视图层次结构中移除视图(或移动到另一个视图)时,布局约束会发生什么?
例如,让我们的容器C
包含子视图A
和B
。容器C
拥有一些约束。然后我们打电话给[A removeFromSuperview]
。 A
的约束会发生什么?
如果我们再次将A
添加到C
会怎么样?
答案 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
,您可以看到蓝色约束消失。