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

时间:2010-07-14 08:40:21

标签: iphone animation ios4

所以我有一些动画块可以在我的应用程序上创建一些非常简单的动画(例如连续旋转的轮子)。这是动画的代码(如果从旧的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”方法,这是奇怪的,因为这个动画永远不会完成。此外,当应用程序变为活动状态且动画实际停止时,它不会被调用。

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

3 个答案:

答案 0 :(得分:1)

您应该使用NSTimer设置计时器或使用CADisplaylink,如下所示: displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateImages :)];并在委托方法中更改视图的旋转CGAffineTransformMakeRotation(度)。

答案 1 :(得分:1)

我遇到了类似的问题。我能够克服这个问题 通过添加关闭应用程序在后台运行的能力 关键:“应用程序不在后台运行”并将其设置为YES 在info.plist中。如果您的应用不需要在后台运行 如果它恢复到初始状态然后恢复它就可以了 会工作的。

答案 2 :(得分:0)

代码的语法无效;您的代码将无法编译,如图所示。正确的版本是:

    [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
                 }
    ];

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