使用setNeedsLayout动画约束更改

时间:2019-02-18 11:19:21

标签: ios animation autolayout uikit

动画约束变化的标准方法是。

// Change constraints like:
someConstraint.constant = 100 

UIView.animate(withDuration: 0.25) {
    view.layoutIfNeeded()
}

但是我一直在观看WWDC 2015 session on multitasking on iPad and at the end,它说不要在动画块中使用layoutIfNeeded,而应使用setNeedsLayout。但是我一直认为这意味着布局会在运行循环的后面进行,因此在动画块之外。也许它还记得它是在动画块中调用的?

我尝试在我的代码中将layoutIfNeeded替换为setNeedsLayout,但似乎可行。这只是巧合,我们实际上应该使用setNeedsLayout为自动布局更改设置动画吗?

Slide from WWDC video showing to use setNeedsLayout instead

1 个答案:

答案 0 :(得分:0)

layoutIfNeeded()的文档说明:

  

使用此方法强制视图立即更新其布局。使用自动版式时,版式引擎会根据需要更新视图的位置,以满足约束的更改。使用接收消息的视图作为根视图,此方法从根开始布置视图子树。如果没有任何布局更新待处理,则此方法将退出,而不修改布局或调用任何与布局相关的回调。

setNeedsLayout()的文档说明:

  

要调整视图子视图的布局时,请在应用程序的主线程上调用此方法。此方法记录请求并立即返回。因为此方法不会强制立即更新,而是等待下一个更新周期,所以您可以使用它在更新任何视图之前使多个视图的布局无效。此行为使您可以将所有布局更新合并到一个更新周期,这通常可以提高性能。

setNeedsLayout()将视图的所有子视图的布局推迟到运行循环的下一个周期,从而将所有更改合并到适当的时间,而不是回避该过程并强制立即进行布局。是的,您应该在UIView.animate函数中使用setNeedsLayout()而不是layoutIfNeeded()。尽可能成为一个好公民。