【发布时间】:2014-01-03 17:49:18
【问题描述】:
我知道自动布局链基本上包含 3 个不同的过程。
- 更新约束
- 布局视图(这里是我们计算帧的地方)
- 显示
我不太清楚-setNeedsLayout 和-setNeedsUpdateConstraints 之间的内在区别。来自 Apple 文档:
当您需要时,在应用程序的主线程上调用此方法 调整视图子视图的布局。这个方法记下了 请求并立即返回。因为这种方法不 强制立即更新,而是等待下一次更新 循环,你可以使用它来使多个视图的布局无效 在更新任何这些视图之前。此行为允许您 将所有布局更新合并到一个更新周期,即 通常更好的性能。
当您的自定义视图的属性发生变化时会影响 约束,可以调用该方法来表示约束 需要在将来的某个时候更新。然后系统将 调用 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方法
那么什么时候可以用一个代替另一个呢?关于布局方法,我需要在约束发生变化的视图或父视图上调用它们吗?
【问题讨论】:
-
我不明白人们投票反对......真的。所以。你应该做点什么,比如要求一个强制性的理由,否则它们完全没有意义
-
也许他们只需要获得评论家徽章(第一票否决)
-
我强烈建议您查看here。答案更多的是解决实际问题。另见this video
标签: ios objective-c autolayout nslayoutconstraint