2
setNeedsLayout与setNeedsUpdateConstraints和layoutIfNeeded与updateConstraintsIfNeeded
我知道自动布局链基本上包含3个不同的过程。 更新约束 布局视图(这是我们计算框架的位置) 显示 对我来说,还不完全清楚-setNeedsLayout和之间的内在区别-setNeedsUpdateConstraints。从Apple Docs: 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一切都按预期方式工作,但如果我改变-layoutIfNeeded用-updateConstraintsIfNeeded,动画将不会发生。 我试图做出自己的结论: -updateConstraintsIfNeeded 仅更新约束,但不强制布局进入流程,因此仍保留原始帧 -setNeedsLayout调用也-updateContraints方法 那么什么时候可以使用一个代替另一个呢?关于布局方法,是否需要在约束发生变化的视图或父视图上调用它们?