如何在不中断动画的情况下更改动画的持续时间?

时间:2012-12-10 17:11:19

标签: objective-c ios cocoa-touch

我使用以下代码示例旋转(连续旋转)UIImageView

CAKeyframeAnimation *theAnimation = [CAKeyframeAnimation animation];
theAnimation.values = [NSArray arrayWithObjects:
    [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0,0,1)],
    [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0,0,1)],
    [NSValue valueWithCATransform3D:CATransform3DMakeRotation(2*M_PI, 0,0,1)],
    nil];
theAnimation.cumulative = YES;
theAnimation.duration = duration;
theAnimation.repeatCount = HUGE_VALF;
theAnimation.removedOnCompletion = YES;
[self.layer addAnimation:theAnimation forKey:@"transform"];

现在我想在显示动画时更改旋转速度(表示不同的持续时间)。最简单的方法是停止动画并创建一个新动画。这样做的问题是,新动画将从0度开始,当旋转视图的速度发生变化时,这会导致丑陋的跳跃。

如何在不中断动画的情况下更改动画的持续时间?

1 个答案:

答案 0 :(得分:1)

保存对上一个旋转的引用,然后在创建新动画时将其用作起始值。

CALayer* layer = [self.layer presentationLayer]; 
float currentAngle = [[layer valueForKeyPath:@"transform.rotation.z"] floatValue];

为了更深入地解释为什么你应该调用[[self.layer presentationLayer] valueForKeyPath .....而不是[self.layer valueForKeyPath .......在核心深入解释动画编程指南。由于旋转(变换)已经设置了动画,因此您需要检查所显示图层的值。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/CoreAnimationArchitecture.html