如何从停止位置启动CAKeyframeAnimation

时间:2013-07-30 03:57:09

标签: iphone ios animation

我使用CAKeyframeAnimation进行旋转动画。我使用btn来分层上的动画。我希望下一个旋转动画从前动画停止弧度开始。我用kCAFillModeForwards设置fillmode,是的,停止弧度没有重置为原始,但我开始下一个旋转动画,始终是原始动画而不是预停止状态。是否有解决方案。

2 个答案:

答案 0 :(得分:2)

我不完全理解这个问题,你想让它在旋转后保持角度,第二次旋转是另一个动画吗?或者你想让它无限期旋转吗?

我要瞄准两者。

保持角度

您希望它旋转一次,然后将其保持在当前角度,然后再将其旋转?

那么,您需要了解“模型层”和“表示层”是如何形成的。一旦表示层转到(removedOnCompletion),它将恢复为模型层,因此您可能想要做的是修改“模型层”以给出最终结果。

CALayer *layer = <#self.myview.layer#>;

CGFloat angle = M_PI_4;

// Get the new transform
CATransform3D transform = CATransform3DRotate(layer.transform, angle, 0, 0, 1);

// Apply the animation to the "presentation layer"
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];

animation.fromValue = [NSValue valueWithCATransform3D:layer.transform];
animation.toValue   = [NSValue valueWithCATransform3D:transform];
animation.duration  = 1.0;

animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;

[layer addAnimation:animation forKey:@"spinme"];

// Apply the transform to the "model layer"
layer.transform = transform;

请注意,到最后,我设置layer.transform,这样就可以了,当动画结束时,模型图层与表示层保持同步。

无限期旋转

您应该注意的两个关键属性是:

animation.cumulative = YES;
animation.repeatCount = HUGE_VALF;
  • 累积使得,好...累积,将前一个变换的结果相加。它不会恢复到原始状态。
  • 重复计数决定它旋转的次数,而HUGE_VALF基本上是说无限的好方法。

另一方面,如果动画确实自行完整循环,则可以避免使用cumulative。例如,以下动画:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

animation.fromValue = @(0);
animation.toValue   = @(2*M_PI);
animation.duration  = 1.0;

animation.cumulative = NO;
animation.repeatCount = HUGE_VALF;
animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;

不需要累积标志,因为它会转动整个360º(2 * pi),但重复计数仍然相关。完成后删除主要是可选的,因为理论上动画永远不会结束,只有当其他人删除它时。

您选择哪种方法,这取决于您要完成的具体目标。

答案 1 :(得分:0)

如果您希望下一个旋转动画从预停止状态开始,关键点是,在预动画结束时,您应该根据表示层的当前值更新模型图层。