我有一个 UIView,它通过几个约束放置在屏幕上。一些约束属于 superview,其他约束属于其他祖先(例如,可能是 UIViewController 的 view 属性)。
我想移除所有这些旧的约束,并使用新的约束将其放置在新的地方。
如何在不为每个约束创建 IBOutlet 并且必须记住哪个视图拥有该约束的情况下完成此操作?
为了详细说明,幼稚的方法是为每个约束创建一组 IBOutlet,然后调用以下代码:
[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
这段代码的问题是,即使在最简单的情况下,我也需要创建2个 IBOutlet。对于复杂的布局,这可以很容易地达到4或8个所需的 IBOutlet。此外,我还需要确保在正确的视图上调用消除约束的调用。例如,假设 myViewsLeftConstraint
为 viewA
所有。如果我不小心调用 [self.view removeConstraint:self.myViewsLeftConstraint]
,什么也不会发生。
注意: 方法 约束影响轴的布局看起来很有前途,但是仅用于调试目的。
更新: 我收到的许多答案都与 self.constraints
、 self.superview.constraints
或其他变体有关。这些解决方案不会起作用,因为这些方法只返回视图的约束 拥有,而不返回视图的约束 感人至深。
为了澄清这些解决方案的问题,请考虑以下视图层次结构:
现在假设我们创建了以下约束,并总是将它们附加到它们最近的共同祖先上:
现在假设我们想移除所有影响 Me
的约束。任何适当的解决方案都应该移除 [C0,C1,C2,C3,C4]
而不是其他任何东西。
如果我使用 self.constraints
(其中 self 是 Me) ,我将得到 [C0,C1,C7]
,因为这些是 Me 拥有的唯一约束。显然,这将不足以删除这,因为它缺少 [C2,C3,C4]
。此外,它正在不必要地删除 C7
。
如果我使用 self.superview.constraints
(其中自我是我) ,我将得到 [C2,C5]
,因为这些是父亲所拥有的约束。显然,我们不能删除所有这些,因为 C5
是完全无关的 Me
。
如果我使用 grandfather.constraints
,我将得到 [C3,C4,C6]
。同样,我们不能删除所有这些,因为 C6
应该保持完整。
强制方法是遍历每个视图的祖先(包括它本身) ,并查看 firstItem
或 secondItem
是否是视图本身; 如果是,删除该约束。这将导致一个正确的解决方案,返回 [C0,C1,C2,C3,C4]
,并且只返回那些约束。
然而,我希望有一个比必须遍历整个祖先列表更优雅的解决方案。