UIView
的{{1}}方法有一个注释:
作为约束的一部分,您不得使任何约束无效 更新阶段。您也不能调用布局或绘图阶段 约束更新的一部分。
我不清楚什么会使约束无效。
答案 0 :(得分:7)
通过一些实验,我发现简单地添加,删除或编辑约束不会自动调用setNeedsUpdateConstraints
。事实上,我找不到任何方法让系统自动调用setNeedsUpdateConstraints
。连同我的观察结果updateConstraints
在没有setNeedsUpdateConstraints
或invalidateIntrinsicContentSize
被首先调用的情况下不会被调用,我认为使任何约束无效的唯一有意义的方法是通过调用我自己setNeedsUpdateConstraints
或invalidateIntrinsicContentSize
。因此,该问题中的说明的含义是:
您不得在 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会显示样本代码。