我知道自动布局链基本上包含3个不同的过程。
- 更新约束
- 布局视图(这是我们计算框架的位置)
- 显示
对我来说,还不完全清楚-setNeedsLayout
和之间的内在区别-setNeedsUpdateConstraints
。从Apple Docs:
若要调整视图的子视图的布局,请在应用程序的主线程上调用此方法。此方法记录请求并立即返回。因为此方法不会强制立即更新,而是等待下一个更新周期,所以您可以使用它在更新任何这些视图之前使多个视图的布局无效。此行为使您可以将所有布局更新合并到一个更新周期,这通常可以提高性能。
当自定义视图的属性以影响约束的方式更改时,您可以调用此方法以指示在将来的某个时刻需要更新约束。然后,系统将调用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
方法
那么什么时候可以使用一个代替另一个呢?关于布局方法,是否需要在约束发生变化的视图或父视图上调用它们?