为什么文档表明CALayer动画必须在UIView动画块中?

rav*_*ron 6 core-animation calayer uiview ios

我目前正在阅读Apple的核心动画指南,在那里我发现以下关于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"];
}];
Run Code Online (Sandbox Code Playgroud)

这意味着必须将CALayers支持UIView的隐式和显式动画放在动画块中.

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

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


一些额外的说明:

我假设"UIView类默认禁用图层动画,但在动画块内重新启用它们"是指该+[UIView setAnimationsEnabled:]方法.当我回到那个可以做这样一台电脑,我会检查,看看是否+[UIView areAnimationsEnabled]回报YESNO.

Dav*_*ist 4

该引用指的是支持视图的层。对于您自己创建和管理的独立层而言,情况并非如此。

\n\n
\n\n

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

\n\n

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

\n