1

CAKeyframeAnimation用来做旋转动画。我正在使用一个按钮来触发图层上的动画。

我想从上一个动画停止弧度开始下一个旋转动画。我设置fillmodekCAFillModeForwards,但停止弧度不会重置为原始,但是当我下一次开始旋转动画时,动画总是从原始开始而不是从上一个停止状态开始。

有解决办法吗?

4

2 回答 2

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),但重复计数仍然相关。完成时的删除大部分是可选的,因为理论上动画永远不会结束,只有当其他人删除它时。

你选择什么方法,这完全取决于你到底想要完成什么。

于 2013-07-30T04:41:12.730 回答
0

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

于 2014-08-06T07:28:14.790 回答