删除所有影响UIView的约束
我有一个通过多个约束放置在屏幕上的UIView。某些约束由超级视图拥有,而其他约束则由其他祖先拥有(例如,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个所需的IBOutlets。此外,我需要确保在适当的视图上正在调用删除约束的调用。例如,假设myViewsLeftConstraint归拥有viewA。如果我不小心打了电话[self.view removeConstraint:self.myViewsLeftConstraint],什么也不会发生。 注意:方法constraintsAffectingLayoutForAxis看起来很有希望,但仅用于调试目的。 更新:很多我收到处理问题的答案self.constraints,self.superview.constraints或一些人的变种。这些解决方案将不起作用,因为这些方法仅返回视图所拥有的约束,而不会影响那些约束视图。 为了阐明这些解决方案的问题,请考虑以下视图层次结构: 祖父 父亲 我 儿子 女儿 哥哥 叔叔 现在想象我们创建以下约束,并将它们始终附加到最接近的共同祖先: C0:我:与儿子(我拥有)同上 C1:我:宽度= 100(属于我) C2:我:与兄弟(父亲拥有)相同的身高 C3:我:和叔叔一样(祖父拥有) C4:我:与祖父(祖父拥有)同左 C5:兄弟:与父亲相同(父亲拥有) C6:叔叔:与祖父(祖父拥有)相同 C7:儿子:和女儿(我所有)同左 现在想象我们要删除所有影响的约束Me。任何适当的解决方案都应该删除,[C0,C1,C2,C3,C4]并且别无其他。 如果我使用self.constraints(自我就是我),我将得到[C0,C1,C7],因为这些是我所拥有的唯一约束。显然,仅仅删除它是不够的,因为它丢失了[C2,C3,C4]。此外,它是C7不必要地删除。 如果我使用self.superview.constraints(自我就是我),我会得到[C2,C5],因为那是父亲的约束。显然,我们无法删除所有这些内容,因为它们C5与完全无关Me。 如果我使用grandfather.constraints,我会得到[C3,C4,C6]。同样,我们不能删除所有这些内容,因为它们C6应保持不变。 蛮力方法是循环在每个视图的祖先(包括其本身)的,并且如果看到firstItem或secondItem是视图本身; 如果是这样,请删除该约束。这将导致正确的解决方案,return [C0,C1,C2,C3,C4],并且仅是那些约束。 但是,我希望有一个比必须遍历整个祖先列表更优雅的解决方案。