CAAnimations,并更新图层树

时间:2013-05-30 17:50:14

标签: iphone ios core-animation

此苹果文档https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/uid/TP40004514-CH3-SW3

显示如何使用显式动画为某些属性设置动画,然后立即在图层上设置该属性,以便在显式动画完成时,属性的最终值是正确的。

但是,直接在图层上设置属性也会导致隐式动画。我觉得我在程序中看到了一个错误,其中隐式动画和显式动画都在运行。

有人可以解释一下这是如何工作的吗?在示例代码中,是否在设置显式动画时忽略了隐式动画?

---更新---

所以我特别看到的问题是我有一个动画来改变一个层的位置。它看起来与苹果示例代码基本相同

CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"position"];
anim.fromValue = startValue;
anim.toValue = endValue;
anim.duration = 1.0;
[theLayer addAnimation:anim forKey:@"myAnimation"];

// Change the actual data value in the layer to the final value.
position.position = endValue; // As a CGPoint

我观察到的故障首先是我看到位置变化很快(我猜是隐式动画),然后它变慢(这是我的动画)。

我刚注意到的一件事就是我的代码中的不同之处在于我给出我的显式动画的ID是“myAnimation”,而不是“position”。但这又引出了另一个问题,如果你给两个动画都提供相同的ID(苹果示例代码中的“不透明度”),并且隐式动画设置为第二个,那为什么不能赢得这个?

1 个答案:

答案 0 :(得分:1)

在其他人遇到此情况时,我的问题是我的图层中添加了两个动画。他们都在为position属性设置动画,但是他们有不同的ID,所以两者都在运行。

我通过将隐式动画包装在关闭操作的事务中解决了我的问题。

[CATransaction begin];
[CATransaction setDisableActions:YES];
theLayer.position = endValue;
[CATransaction commit];