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

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

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

例如,让我们让容器C的子视图AB 容器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 ,你可以看到蓝色约束消失。