Ios 使用setNeedsLayout设置约束更改的动画
设置约束更改动画的标准方法是Ios 使用setNeedsLayout设置约束更改的动画,ios,animation,autolayout,uikit,Ios,Animation,Autolayout,Uikit,设置约束更改动画的标准方法是 // Change constraints like: someConstraint.constant = 100 UIView.animate(withDuration: 0.25) { view.layoutIfNeeded() } 然而,我在看它说不要在动画块中使用layoutIfNeeded,而是使用setNeedsLayout。然而,我一直认为这意味着布局发生在运行循环的后面,因此在动画块之外。也许它记得它是在动画块中调用的 我试着在我的代码
// Change constraints like:
someConstraint.constant = 100
UIView.animate(withDuration: 0.25) {
view.layoutIfNeeded()
}
然而,我在看它说不要在动画块中使用layoutIfNeeded
,而是使用setNeedsLayout
。然而,我一直认为这意味着布局发生在运行循环的后面,因此在动画块之外。也许它记得它是在动画块中调用的
我试着在我的代码中用setNeedsLayout
替换layoutifneed
,结果似乎奏效了。这是否只是巧合,我们实际上应该使用setNeedsLayout
设置自动布局更改的动画
关于
layoutifneed()的文档说明:
使用此方法可强制视图立即更新其布局。使用“自动布局”时,布局引擎会根据需要更新视图的位置,以满足约束中的更改。使用接收消息的视图作为根视图,此方法从根开始布置视图子树。如果未挂起任何布局更新,则此方法将退出,而不修改布局或调用任何与布局相关的回调
setNeedsLayout()
的文档说明:
如果要调整视图子视图的布局,请在应用程序的主线程上调用此方法。此方法记录请求并立即返回。由于此方法不会强制立即更新,而是等待下一个更新周期,因此可以使用它在更新任何视图之前使多个视图的布局无效。此行为允许您将所有布局更新合并到一个更新周期中,这通常会提高性能
setNeedsLayout()
将视图的所有子视图的布局推迟到运行循环的下一个周期,从而将所有更改合并到适当的时间,而不是绕过流程并强制立即进行布局。是的,您应该在UIView.animate函数中使用setNeedsLayout()
而不是layoutifneed()
。如果可能的话,做一个好公民。这些具体的评论(或者,我应该说,似乎)与尺寸变化期间的动画密切相关。如果由于点击按钮(例如)而更改约束,是否确定没有看到差异?将你的持续时间更改为2.0
,看看它是否真的在2秒钟内产生动画效果,例如,一个漂亮、缓慢的“滑动”到新位置。但这并不是说动画效果