我知道自动布局链基本上包括3个不同的过程。
更新的约束 布局视图(这里是我们得到帧计算的地方) 显示
我不太清楚的是-setNeedsLayout和-setNeedsUpdateConstraints之间的内在区别。来自Apple Docs:
setNeedsLayout
Call this method on your application’s main thread when you want to adjust the layout of a view’s subviews. This method makes a note of the request and returns immediately. Because this method does not force an immediate update, but instead waits for the next update cycle, you can use it to invalidate the layout of multiple views before any of those views are updated. This behavior allows you to consolidate all of your layout updates to one update cycle, which is usually better for performance.
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一切工作如预期,但如果我改变-layoutIfNeeded与-updateConstraintsIfNeeded,动画不会发生。 我试图得出自己的结论:
updateconstraintsifneeded只更新约束,但不强制布局进入进程,因此原始帧仍然被保留 -setNeedsLayout同时调用-updateContraints方法
那么什么时候用一种代替另一种合适呢?关于布局方法,我需要在约束发生变化的视图或父视图上调用它们吗?