Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用setNeedsLayout设置约束更改的动画_Ios_Animation_Autolayout_Uikit - Fatal编程技术网

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秒钟内产生动画效果,例如,一个漂亮、缓慢的“滑动”到新位置。但这并不是说动画效果