【问题标题】:Why do docs indicate CALayer animations must be in UIView animation blocks?为什么文档指出 CALayer 动画必须在 UIView 动画块中?
【发布时间】:2015-03-21 17:25:05
【问题描述】:

我目前正在阅读 Apple 的 Core Animation Guide,在那里我发现了以下关于 iOS 中支持层的视图的文章:

如果您想使用 Core Animation 类来启动动画,您必须从基于视图的动画块内发出所有 Core Animation 调用。 UIView 类默认禁用图层动画,但在动画块内重新启用它们。因此,您在动画块之外所做的任何更改都不是动画。

就在引用下方,文档包括以下代码清单:

[UIView animateWithDuration:1.0 animations:^{
   // Change the opacity implicitly.
   myView.layer.opacity = 0.0;

   // Change the position explicitly.
   CABasicAnimation* theAnim = [CABasicAnimation animationWithKeyPath:@"position"];
   theAnim.fromValue = [NSValue valueWithCGPoint:myView.layer.position];
   theAnim.toValue = [NSValue valueWithCGPoint:myNewPosition];
   theAnim.duration = 3.0;
   [myView.layer addAnimation:theAnim forKey:@"AnimateFrame"];
}];

这意味着CALayers 上支持UIViews 的隐式和显式动画都必须放在动画块中。

但是,我发现这显然是不真实的。具体来说,我已经使用UIView 动画块之外的核心动画类成功地实现了显式动画。

我是否误解了这段话,或者它已经过时了,还是其他什么?


一些补充说明:

我假设“UIView 类默认禁用图层动画但在动画块内重新启用它们”指的是+[UIView setAnimationsEnabled:] 方法。当我回到可以这样做的计算机时,我会检查+[UIView areAnimationsEnabled] 是否返回YESNO

【问题讨论】:

    标签: ios uiview core-animation calayer


    【解决方案1】:

    那句话是指支持视图的层。对于您自己创建和管理的独立图层,情况并非如此。


    iOS 上的每个视图都由一个层支持。当您更改视图的属性时,它会更改底层属性。默认情况下,该层将具有隐式动画,但该层“禁用”该行为,除非您在 UIView 动画块内。这就是文档的那部分所指的内容。

    您可以通过多种方式使用 Core Animation 为图层属性设置动画。最常见的是当您想要为属性设置动画时将动画对象添加到图层,但如果您总是想在属性更改时进行动画处理,您也可以通过actions 字典和styles 字典进行自定义。对于支持视图的层,最后两个也将被禁用。

    【讨论】:

    • 所以您是说UIViews 在其支持层上禁用隐式 动画(UIView 动画块内除外),但继续允许显式动画?如果是这样,这与文档不同,文档认为 所有 CA 调用必须在动画块内。
    • 如果这就是它所说的那么它是错误的/措辞不佳。这绝对不是真的。
    • @ravron 该段位于“如何为支持图层的视图设置动画”部分下。对我来说,很明显它与支持 UIView 的层有关。
    • 当然。我们都同意它指的是支持UIView 的层。问题是为什么文档说UIViews 在其支持层上禁用隐式和显式动画,而事实并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多