我正在制作一个无限旋转动画,当我第一次启动它时效果很好。我想要实现的是能够在运行时改变旋转速度。我在animationView中有这个功能:
-(void)startBlobAnimationfloat)deltaT
{
[UIView beginAnimations"Spinning" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:deltaT];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationRepeatCount:FLT_MAX];
CGAffineTransform rotation = CGAffineTransformMakeRotation(-symmetryAngle);
blobView.transform = rotation;
// Commit the changes and perform the animation.
[UIView commitAnimations];
}
在动画首次启动后使用不同的 deltaT 值调用它没有任何效果。如果我在函数的开头添加 [wheelView.layer removeAllAnimations]; 那么它会成功停止动画但不会重新启动它。我还尝试使用 block 命令启动动画,结果相同。在这一点上,我完全感到困惑。有人可以解释问题是什么吗?谢谢!
Best Answer-推荐答案 strong>
经过长期的努力,我想出了一个似乎可以完美运行并在动画之间提供平滑过渡的解决方案。基本上我只是想出当前的旋转角度并用它以不同的速率重新启动动画。这里的一个关键点在最后一行:你必须有那个 anim.keyPath - 它不能是 Nil(从经验中得知)。我猜这样新动画会替换旧动画。哦,说得更清楚一点:symmetryAngle 是一种使对象看起来相同的旋转,例如 5 倍对称的 72 度。
-(void)startWheelsAnimationfloat)deltaT
{
float startingAngle = 0.0;
if(isAnimating) {
// If animation is in progress then calculate startingAngle to
// reflect the current angle of rotation
CALayer *presLayer = (CALayer*)[blobView.layer presentationLayer];
CATransform3D transform = [presLayer transform];
startingAngle = atan2(transform.m12, transform.m11);
}
isAnimating = YES;
// Restart the animation with different duration, and so that it starts
// from the current angle of rotation
CABasicAnimation * anim = [ CABasicAnimation animationWithKeyPath"transform.rotation.z" ] ;
anim.duration = deltaT;
anim.repeatCount = CGFLOAT_MAX;
anim.fromValue = @(startingAngle);
anim.toValue = @(startingAngle - symmetryAngle) ;
[blobView.layer addAnimation:anim forKey:anim.keyPath];
}
关于ios - 更改正在运行的动画的持续时间(速度),我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/21589483/
|