我使用CAKeyframeAnimation进行旋转动画。我使用btn来分层上的动画。我希望下一个旋转动画从前动画停止弧度开始。我用kCAFillModeForwards设置fillmode,是的,停止弧度没有重置为原始,但我开始下一个旋转动画,始终是原始动画而不是预停止状态。是否有解决方案。
答案 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;
另一方面,如果动画确实自行完整循环,则可以避免使用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)
如果您希望下一个旋转动画从预停止状态开始,关键点是,在预动画结束时,您应该根据表示层的当前值更新模型图层。