最佳答案
我知道自动布局链基本上包括3个不同的过程。
我不太清楚的是-setNeedsLayout
和-setNeedsUpdateConstraints
之间的内在区别。从苹果文档:
当你需要时,在你的应用程序主线程上调用这个方法 调整视图子视图的布局。这种方法做笔记 请求并立即返回。因为这个方法没有 强制立即更新,但等待下一次更新 循环,您可以使用它来使多个视图的布局无效 在更新这些视图之前。这种行为允许您 将所有布局更新合并到一个更新周期,即 通常性能更好。
当您的自定义视图的属性以一种会影响 约束,您可以调用此方法来指示约束 需要在将来的某个时候进行更新。系统将会 调用updateConstraints作为其正常布局传递的一部分。更新 所有的约束都在你需要的时候同时出现确保你 当有多个更改时,不必重新计算约束
. .
当我想在修改约束后动画视图并动画更改时,我通常调用例如:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
我发现如果我使用-setNeedsLayout
而不是-setNeedsUpdateConstraints
,一切都能正常工作,但如果我用-updateConstraintsIfNeeded
改变-layoutIfNeeded
,动画就不会发生
我试图得出自己的结论:
-updateConstraintsIfNeeded
只更新约束,但不强制布局进入过程,因此原始帧仍然保留-setNeedsLayout
也调用-updateContraints
方法那么什么时候用一种代替另一种合适呢?关于布局方法,我需要在约束发生变化的视图或父视图上调用它们吗?