2

我正在试验 CAAnimation 并且像许多新人一样在做 CAAnimation;完成后,图层将恢复到其原始状态。

关于如何解决这个问题的问题在这里问了几次,答案是将以下代码添加到您的 CAAnimation。

animation.removedOnCompletion = NO;

虽然这可行,但根据 Apple 讨论 CAAnimation 的 WWDC 视频,推荐的解决方案是:

// animating opacity
layer.opacity = newOpacityValue;
[layer addAnimation:animation forKey:@"opacity"];

所以我很想知道这两者之间的主要区别是什么以及何时使用它们?

4

2 回答 2

13

显式动画实际上并不修改 CALayer 的属性。

他们只是修改了presentationLayer,这就是你实际看到的。动画完成后,您将看到与动画之前完全相同的 CALayer。

通过像这样设置值

// animating opacity
layer.opacity = newOpacityValue;
[layer addAnimation:animation forKey:@"opacity"];

您确保动画值存储在模型中,因此即使从图层中删除动画,您的更改也会继续存在。

使用 removedOnCompletion = YES 不是一个持久的解决方案。每当您从图层中删除动画时,它都会恢复到旧状态。

于 2012-02-17T16:19:20.267 回答
4

您不需要“removedOnCompletion”标志。

您需要将不透明度设置为动画外部的新值 - 作为您的第二个示例。

使用“removedOnCompletion”不会释放你的动画对象 - 如果你有很多动画,会炸毁你的记忆。

CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"opacity"];
animation.fromValue=[NSNumber numberWithFloat:0];
animation.toValue=[NSNumber numberWithFloat:1];

layer.opacity=1; // this line will make sure the opacity will stay 1 when the animation is completed
[layer addAnimation:animation forKey:@"opacity"];
于 2012-02-17T16:12:47.997 回答