哪些操作会使约束无效?

时间:2013-12-13 01:00:15

标签: ios autolayout

UIView的{​​{1}}方法有一个注释:

  

作为约束的一部分,您不得使任何约束无效   更新阶段。您也不能调用布局或绘图阶段   约束更新的一部分。

我不清楚什么会使约束无效。

2 个答案:

答案 0 :(得分:7)

通过一些实验,我发现简单地添加,删除或编辑约束不会自动调用setNeedsUpdateConstraints。事实上,我找不到任何方法让系统自动调用setNeedsUpdateConstraints。连同我的观察结果updateConstraints在没有setNeedsUpdateConstraintsinvalidateIntrinsicContentSize被首先调用的情况下不会被调用,我认为使任何约束无效的唯一有意义的方法是通过调用我自己setNeedsUpdateConstraintsinvalidateIntrinsicContentSize。因此,该问题中的说明的含义是:

  

您不得在 updateConstraints 中调用 [self setNeedsUpdateConstraints] [self invalidateIntrinsicContentSize]

答案 1 :(得分:1)

很棒的问题!

Richard Warren在他的博客教程UNDERSTANDING AUTO LAYOUT中介绍了这一点:

  

如果我们想要使视图的约束无效,我们应该删除   旧约束,然后调用setNeedsUpdateConstraints。我们的定制   然后可以提供updateConstraints或updateViewConstraints方法   新约束。

约束不应该在updateConstraints方法中无效。这在UIView Class Reference

中明确说明
  

自行设置约束的自定义视图应该通过以下方式实现   重写此方法。当您的自定义视图记录了更改时   已经被视为使其中一个约束无效的视图   应立即删除该约束,然后调用   setNeedsUpdateConstraints注意到需要更新约束。   在执行布局之前,执行updateConstraints   将被调用,允许您验证所有必要的约束   在您的自定义视图的时候,您的内容就位   属性没有变化。

     

作为约束的一部分,您不能使任何约束无效   更新阶段。您也可以不调用布局或绘图阶段   约束更新的一部分。

这与视图控制器等效updateViewConstraints不同。没有类似的规定不使该方法中的约束无效。当然,Erica Sadun's book会显示样本代码。