从Superview(Autolayout)以编程方式删除视图后更新约束/帧

时间:2014-07-10 20:06:06

标签: ios objective-c cocoa-touch cocoa autolayout

我在IB中使用Autolayout。我的屏幕布局如下所示:

+-----------------+
| +--+ +--+ +--+  |
| |  | |  | |  |  |
| |  | |  | |  |  |
| |1 | |2 | |3 |  |
| |  | |  | |  |  |
| |  | |  | |  |  |
| +--+ +--+ +--+  |
+-----------------+

我的目标是创建灵活的动态视图。每当从视图中移除其中一个中心框([object removeFromSuperview])时,我希望更新约束,在所有对象之间保持一致的空间。

例如,删除中心对象后,视图应如下更新:

+-----------------+
| +--+ +--+       |
| |  | |  |       |
| |  | |  |       |
| |1 | |3 |       |
| |  | |  |       |
| |  | |  |       |
| +--+ +--+       |
+-----------------+

目前我有大小限制,底部空间限制和领先的空间限制 - 都是统一的。

在调用removeFromSuperview后,我尝试调用layoutIfNeeded,updateConstraints等。没有效果。对象只是保持原样。

这甚至可以实现吗?

2 个答案:

答案 0 :(得分:2)

对于间距,您可能在视图23之间存在约束。

删除视图2后,您必须在视图13之间创建新约束。

如果视图的数量是真正动态的,并且每个视图的大小一致,那么您应该使用UICollectionView代替。

答案 1 :(得分:1)

如果您只有这3个视图,则可以在1和1之间创建水平间距约束。 3.编辑它以在删除2后为其提供所需的值,并将其优先级更改为小于1000,如900.因此,3将对1和2都有间距约束,但1到2将优先直到视图2被删除。如果你有超过3个视图,它会变得有点复杂,但你可以使用类似的方法。