相关疑难解决方法(0)

setNeedsLayout与setNeedsUpdateConstraints和layoutIfNeeded vs updateConstraintsIfNeeded

我知道汽车布局链基本上包含3个不同的过程.

  1. 更新约束
  2. 布局视图(这里是我们计算框架的地方)
  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];
Run Code Online (Sandbox Code Playgroud)

我发现,如果我使用-setNeedsLayout的,而不是-setNeedsUpdateConstraints一切都按预期工作,但如果我改变-layoutIfNeeded-updateConstraintsIfNeeded,动画将不会发生.
我试图得出自己的结论:

  • -updateConstraintsIfNeeded 仅更新约束但不强制布局进入该过程,因此仍保留原始帧
  • -setNeedsLayout也叫-updateContraints方法

那么什么时候可以使用一个而不是另一个?关于布局方法,我是否需要在约束或父视图中更改的视图上调用它们?

objective-c ios autolayout nslayoutconstraint

220
推荐指数
2
解决办法
9万
查看次数

标签 统计

autolayout ×1

ios ×1

nslayoutconstraint ×1

objective-c ×1