UIView动画不流畅,重复生涩

时间:2015-06-12 06:55:15

标签: ios objective-c animation uiview

我正在尝试创建一个旋转轮动画,当它正在工作时,动画看起来真的很生涩。我需要无限期地旋转此轮并根据用户交互停止它。我用过的代码如下。

-(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,但我还没有编程。因此,递归调用总是在现在进行。

3 个答案:

答案 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];
        }
    }
}];
}