在常见情况下何时使用Core Animation而不是UIView动画是合适的

时间:2016-07-11 01:27:23

标签: ios animation core-animation uiviewanimation ios-animations

这与许多小错误有关,这些小错误可能被一个人刻板地认为是次要的,但主要是另一个人。

我越来越注意到的是,当使用UIView animateWithDuration:的所有口味时,它实际上会不必要地修改内容,例如我的观点的多个属性,以便进行简单的隐藏/显示风格动画等。

在UINavigationBar没有为某个旋转过渡正确调整位置,或者在框架更新时,状态栏没有动画的标题视图,以及视图&#39时,情况似乎很挑剔;当父视图的属性发生变化时,子图层会以不同的方式动画显示...

其中很多我一直在重新审视,并转换为CAAnimations,因为它们似乎更容易管理,因为它们实际上并没有修改我的观点'目标属性值。

一个简单的例子是,使用[view setHidden:],然后将其设置为动画或视图外,但在动画运行时,视图实际上已经可见或隐藏。

另一个是,需要转换/旋转/缩放UINavigationController的视图,并使用CAAnimation来执行此操作,因为如果我修改UINavigationController并且UINavigationBar没有移动到它的正确位置#39; s视图及其任何父视图的转换属性值。

所以在这个问题的结论中,我一直在来回,并且在我的情况下找到了比另一个更合适的地方,但主要是,我想听听其他人对这些情景的看法,以及是否我们对Apple所提供的内容有了一些了解,我可以对自己的方法感觉更好。

提前致谢。

1 个答案:

答案 0 :(得分:13)

在一天结束时,所有UIKit风格的动画都会转换为核心动画风格的动画;也就是说,一切都是使用Core Animation实际动画的。 API之间的差异主要是方便之处:UIKit风格的动画函数更新模型值,提交动画以反映表示层中随时间的变化。

您还必须小心,您要为UIKit表示可以设置动画的属性设置动画。例如,虽然您可以在技术上为UIScrollView contentSizecontentOffset上的属性设置动画,但它们不受官方支持,因此您必须处理副作用。

此外,frame是一种特殊情况,因为它实际上是一个派生属性,由centertransformbounds组成(除了anchorPoint上的CALayer UIViewframe未公开。动画视图frame可能会产生许多意想不到的问题,通常涉及轮换。核心动画没有这个问题,因为CALayer不是bounds上明确可动画的属性。如果您遇到涉及该视图的仿射变换(例如,缩放,平移,旋转)的奇怪行为,请尝试在UIKit风格的动画中使用centerframe

在UIKit中设置某些视图的动画可能会产生意想不到的副作用或错误,因为除了动画之外,您还要更新模型值。另一方面,核心动画更灵活,因为您可以更好地控制更新模型层或表示层的方式和时间。

但我不同意UIKit正在不必要地修改内容。它修改了需要修改的内容,以便提交您请求的动画更改以及更新其模型值。当您为layoutSubviews()等属性设置动画时,这将在当前运行循环后隐式调用该视图上的setNeedsLayout(),这可以级联到其他子视图等等。

如果您希望UIKit在制作动画之前执行其所有布局逻辑,请在调用动画块之前调用layoutIfNeeded()UIViewAnimationOptions.layoutSubviews。如果您希望UIKit在提交动画的同时实际制作整个子视图层次结构的更改动画,请指定public DataTable searchname(string value) { string query = String.Format("Select Name from Users Where Name Like '%{0}%'", value); return search(query); } 选项。这将在动画块中立即触发子视图布局,因此这些值也是动画的。否则,动画更改的模型值将在下一个运行循环中触发布局更新。

一般来说,我很少注意到使用UIKit风格动画功能的问题。因此,如果有人花了大量时间在iOS上制作动画,我会说:

在每个地方都可以使用UIKit风格的动画,因为它们非常方便。当您遇到UIKit风格的动画问题时,或者您需要具体控制图层模型和演示文稿值的更新方式时,应使用核心动画风格的动画。