相关疑难解决方法(0)

删除所有影响UIView的约束

我有一个UIView,通过几个约束放在屏幕上.一些约束由superview拥有,其他约束由其他祖先拥有(例如,可能是UIViewController的view属性).

我想删除所有这些旧约束,并使用新约束将其置于新的位置.

如果不为每个约束创建一个IBOutlet并且必须记住哪个视图拥有所述约束,我该怎么做呢?

详细说明,天真的方法是为每个约束创建一堆IBOutlet,然后涉及调用代码,例如:

[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
Run Code Online (Sandbox Code Playgroud)

这段代码的问题在于,即使在最简单的情况下,我也需要创建2个IBOutlet.对于复杂的布局,这可以轻松达到4或8个所需的IBOutlet.此外,我需要确保在正确的视图上调用我的删除约束的调用.例如,想象一下,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].同样,我们无法删除所有这些,因为 …

constraints objective-c uiview ios autolayout

71
推荐指数
6
解决办法
8万
查看次数

标签 统计

autolayout ×1

constraints ×1

ios ×1

objective-c ×1

uiview ×1