删除视图时,约束会发生什么情况
我的问题很简单,但我找不到任何文件中的信息。
当视图从视图层次结构中移除(或移动到另一个视图)时,布局约束会发生什么?
例如,让我们让容器C
的子视图A
和B
容器C
有一些限制。 然后我们调用[A removeFromSuperview]
。 A
的约束会发生什么?
如果再次将A
添加到C
,会发生什么?
约束被删除。 如果再次添加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]; } }
由于我也有这个问题,我检查了苹果文件只是为了踢,事实certificate,这是logging的约束被删除。
UIView removeFromSuperview方法的文档指出:
调用此方法将删除引用要删除的视图的任何约束,或删除要删除的视图的子树中的任何视图。
我不知道去年是否logging了原始问题,但我只是想分享这个信息,以防万一需要的时候…
但请注意,如果您有两个独立的父视图A和B以及一个子视图C,其中C当前是A的子视图,并且具有适当的约束,那么调用[B addSubview:C]将不会清除与A有关的任何约束和C,自动布局将开始抛出exception,因为这些约束不再与同一层次中的视图相关。
在将C添加到B之前,您需要显式调用[C removeFromSuperview]以删除约束。
这在Mac OS X上是正确的 – 我没有检查iOS
当您[A removeFromSuperview]
他们被遗忘,并再次添加A到C没有添加约束。
他们也被删除,你可以做一个简单的testing。 select一个视图SUBVIEW,并创buildcostraints约束SUBVIEW遵循其超级视图大小调整(如附加到超视图边缘)。 为此,您将SUBVIEW作为子视图添加到此CONTAINERVIEW中,并添加如下约束条件:
五:| – [子视图] – |
H:| – [子视图] – |
这些约束应该添加到SUBVIEW超级视图,因此CONTAINERVIEW。
如果通过简单地检查所有CONTAINERVIEW约束来删除SUBVIEW,则可以看到两个不在附近。
这个问题也可以通过界面生成器来certificate。 在ViewController
上拖放一个UIView
添加约束,然后移除UIView
,你可以看到蓝色约束消失。