为什么我需要这样做,有更好的方法吗? iPhone应用程序OS4上的动画块

所以我有一些动画块可以在我的应用程序上创建一些非常简单的动画(例如,连续旋转的轮子).这是动画的代码(如果来自旧的commitanimations样式块,我已经改变了但是遇到了同样的问题).

[UIView animateWithDuration:30 delay:0.0
     options:(UIViewAnimationOptionAllowUserInteraction |
     UIViewAnimationOptionCurveLinear 
  |  UIViewAnimationOptionRepeat)
animations:^(void){
     wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5);
 }
completion:^(BOOL finished){
 if(finished){NSLog(@"^^^^^^^^wheel^^^^FINSIHED");
   ]}
}];

我遇到的问题是在OS4上,当应用程序被解除到多任务栏并恢复动画停止时.如果正在恢复,我会在应用再次激活时重置位置,就像这样….

wheel.transform = CGAffineTransformMakeRotation(0);

然后它继续.

这不太理想,因为我的动画在重新启动时会跳过.我不明白为什么会发生这种情况或为什么我需要这样做.

动画开始时几乎立即调用“on finished”方法,这是奇怪的,因为这个动画永远不会完成.当应用程序变为活动状态且动画实际停止时,它也不会被调用.

任何想法或建议?我一直在努力解决这个问题……

最佳答案 代码的语法无效;您的代码将无法编译,如图所示.正确的版本是:

    [UIView animateWithDuration:2 delay:0.0
                    options:(UIViewAnimationOptionAllowUserInteraction |
                             UIViewAnimationOptionCurveLinear 
                             |  UIViewAnimationOptionRepeat)
                 animations:^(void){
                     wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5);
                 }
                 completion:^(BOOL finished){
                     if(finished) NSLog(@"^^^^^^^^wheel^^^^FINSIHED");
                 }
     ];

当应用程序在暂停后恢复并且再次设置动画时,调用“on finished”块的原因是轮子的变换已经处于最终位置(这是您在动画块中设置它的位置).因此,当应用程序恢复时,您必须首先重置轮子的变换(我会通过将其设置为CGAffineTransformIdentity来执行此操作),然后设置动画.

更聪明的方法是使用CGAffineTransformRotate(而不是CGAffineTransformMakeRotation).这样,您可以根据变换现在设置变换,而不是绝对设置变换.

    [UIView animateWithDuration:2 delay:0.0
                    options:(UIViewAnimationOptionAllowUserInteraction |
                             UIViewAnimationOptionCurveLinear 
                             |  UIViewAnimationOptionRepeat)
                 animations:^(void){
                     wheel.transform = CGAffineTransformRotate(view.transform, (M_PI*-0.5));
                 }
                 completion:^(BOOL finished){
                     // whatever
                 }
    ];

我认为你的轮子相对于你选择的角度是对称的,所以用户永远不会看到差异,你所抱怨的滑动(当你重置变换时)将被消除.

点赞