【问题标题】:When is it appropriate to use Core Animation over UIView animation in common cases在常见情况下,什么时候适合在 UIView 动画上使用 Core Animation
【发布时间】:2016-11-12 20:53:29
【问题描述】:

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

我越来越注意到的是,当使用UIView animateWithDuration: 的所有风格时,它实际上会不必要地修改一些东西,比如我的视图的多个属性,做一个简单的隐藏/显示样式动画等等。

在诸如 UINavigationBar 没有为某个旋转过渡正确设置动画位置,或者当它的帧更新时标题视图没有与状态栏一起动画,当视图的子层会隐含不同的动画时,事情似乎很挑剔他们的父视图的属性改变了......

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

一个简单的例子是,使用[view setHidden:],然后对其进行动画处理或使其消失,但在动画运行时视图实际上已经可见或隐藏。

另一个是,需要转换/旋转/缩放 UINavigationController 的视图,并使用 CAAnimation 来完成,因为如果我修改 UINavigationController 的视图,UINavigationBar 不会移动到它的正确位置,它的任何父视图转换属性值。

因此,对于这个问题,我来来回回,一直在寻找一个比另一个更适合我的情况的地方,但主要是,我想听听其他人对这些情况的看法,如果对 Apple 提供的内容有一些见解,我可以对自己的方法感觉更好。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    最终,所有 UIKit 风格的动画都转换为 Core Animation 风格的动画;也就是说,所有内容实际上都是使用 Core Animation 制作的。 API 之间的区别主要在于方便:UIKit 样式的动画函数会更新模型值,提交动画以在表示层中反映随着时间的变化。

    您还必须小心,您正在为 UIKit 说您可以制作动画的属性制作动画。例如,虽然您可以在技术上为 UIScrollView 上的属性设置动画,例如 contentSize 和 contentOffset,但它们不受官方支持,因此您必须潜在地处理副作用。

    另外,frame是一个特例,因为它实际上是一个派生属性,由center、transform和bounds组成(除了CALayer上的anchorPoint,其中UIView不暴露)。为视图的frame 设置动画可能会出现很多意想不到的问题,通常涉及旋转。 Core Animation 没有这个问题,因为frame 不是CALayer 上的显式动画属性。如果您遇到涉及该视图的仿射变换(例如,缩放、平移、旋转)的奇怪行为,请尝试在 UIKit 样式的动画中使用 bounds 和 center。

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

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

    如果您希望 UIKit 在您制作动画之前执行其所有布局逻辑,请在调用动画块之前调用 setNeedsLayout() 和 layoutIfNeeded() 在。如果您希望 UIKit 在提交动画的同时实际为整个子视图层次结构的更改值设置动画,请指定 UIViewAnimationOptions.layoutSubviews 选项。这将在动画块内立即触发子视图布局,因此这些值也会被动画化。否则,动画更改的模型值将在下一个运行循环中触发布局更新。

    一般来说,我很少注意到使用 UIKit 风格的动画函数的问题。因此,作为一个在 iOS 上花费大量时间制作动画的人,我想说:

    在任何地方都可以使用 UIKit 风格的动画,因为它们真的很方便。当您遇到 UIKit 风格的动画问题或需要具体控制如何更新图层的模型和表示值时,应该使用 Core Animation 风格的动画。

    【讨论】:

    • 我想我会跟进你已经深思熟虑的回应。首先,我不知道您仍然可以在 CATransaction 中包装 UIView 动画并适当地修改内容,这很有用。其次,自从对 UIView 方法和它的内部工作更加熟悉以来,我需要回退到 CA 的次数要少得多。遗憾的是,我需要这么多无证知识,但我希望有更好的文档将 CA 与基于 UIKit 的动画联系起来。
    • Core Animation 是由 Apple 的一位(才华横溢的)工程师为最初的 iPhone 创建的,因此在某些方面文档有些欠缺是可以理解的。如果 Apple 花时间更彻底地充实它们并将它们与 UIKit 更好地结合起来,那就太好了。最近可能是这种情况,但我有一段时间没有检查过。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2010-10-24
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多