我正在尝试创建一个旋转轮动画,当它正在工作时,动画看起来真的很生涩。我需要无限期地旋转此轮并根据用户交互停止它。我用过的代码如下。
-(void) spinWheel{
[UIView animateWithDuration:0.1 delay:0 options: UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction animations:^{
_wheel.transform = CGAffineTransformRotate(_wheel.transform, _rotationVelocity*ONE_SECTION_ROTATION);
} completion:^(BOOL finished) {
if(finished){
if(!_decelerating){
[self spinWheel];
}
}
}];
}
现在。然而,由于车轮旋转的速度很快,在动画循环结束时,在重新启动动画的递归调用之前,会注意到一个混蛋。
我不确定如何实现这样的运行顺利进行。
编辑:为了使事情更加明显,_减速总是错误的。它意味着当用户点击按钮时转_true,但我还没有编程。因此,递归调用总是在现在进行。
答案 0 :(得分:2)
为了解决这个问题,我使用了vats建议的CABasicAnimation。我将fromValue设置为0,将一个完整旋转的值设置为INFINITY的repeatCount,并将持续时间设置为等于完成一次旋转所需的时间。
这让我无限地旋转了轮子。当我根据用户交互需要它停止时,我然后删除了上面的动画,计算了轮子的当前位置,并替换为负责减速的第二个动画。第二个动画是CAKeyframeAnimation,具有多个不同的keyTimes和基于我想要设置的减速速度的值。我已经将代码作为github上的要点发布了,它有点乱,因为很多变量名都是我的程序特有的。但它可以让你知道我是如何解决它的。
https://gist.github.com/sosale151/454baadd2634590bffbf11a5077b8a7c
答案 1 :(得分:1)
对于任何转化(缩放,旋转和翻译),最好使用CABasicAnimation
代替UIView animation
。
回答原因:
我所知道的是Quartz提供了创建和转换对象的功能,这就是CABasicAnimation
(核心动画)值得交易的原因。
答案 2 :(得分:0)
试试这个:
-(void) spinWheel {
[UIView animateWithDuration:0.30 animations:^{
_wheel.transform = CGAffineTransformRotate(_wheel.transform, _rotationVelocity*ONE_SECTION_ROTATION);
} completion:^(BOOL finished) {
if(finished){
if(!_decelerating){
[self spinWheel];
}
}
}];
}