Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要这样做,还有更好的方法吗?iPhone应用程序OS4上的动画块_Iphone_Animation_Ios4 - Fatal编程技术网

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

为什么我需要这样做,还有更好的方法吗?iPhone应用程序OS4上的动画块,iphone,animation,ios4,Iphone,Animation,Ios4,因此,我有一些动画块在我的应用程序上创建一些非常简单的动画(例如,一个车轮不断旋转)。这是动画的代码(我从旧的commitanimations样式块中更改了if,但遇到了相同的问题) 我的问题是,在OS4上,当应用程序被关闭到多任务条并恢复时,动画停止。如果在resume上,我会在应用程序再次激活时重置位置,如下所示 wheel.transform = CGAffineTransformMakeRotation(0); 然后继续 这并不理想,因为我的动画在重新启动时会跳过。我不明白为什么会发生

因此,我有一些动画块在我的应用程序上创建一些非常简单的动画(例如,一个车轮不断旋转)。这是动画的代码(我从旧的commitanimations样式块中更改了if,但遇到了相同的问题)

我的问题是,在OS4上,当应用程序被关闭到多任务条并恢复时,动画停止。如果在resume上,我会在应用程序再次激活时重置位置,如下所示

wheel.transform = CGAffineTransformMakeRotation(0);
然后继续

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

“on finished”方法在动画开始时几乎立即被调用,这很奇怪,因为该动画永远不会结束。此外,当应用程序处于活动状态且动画实际停止时,也不会调用它


有人有什么想法或建议吗?我已经为此挣扎了一段时间了…

您应该使用NSTimer设置计时器,或者像这样使用CADisplaylink:
displayLink=[CADisplayLink displayLinkWithTarget:自选择器:@selector(animateImages:)];并在委派方法中更改视图的旋转CGAffineTransformMakeRotation(度)。

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

    [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”块的原因是,控制盘的变换已经在其最终位置(这是在动画块中设置它的位置)。因此,当应用程序恢复时,必须首先重置控制盘的变换(我会通过将其设置为CGAffineTransformidity来实现),然后设置动画

更聪明的方法是使用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
                 }
    ];

我假设你的方向盘相对于你选择的角度是对称的,因此用户将永远看不到差异,你抱怨的打滑(当你重置变换时)将被消除。

我也有类似的问题。我能够通过以下方式克服这个问题: 通过添加 按键:“应用程序不在后台运行”并将其设置为“是” 在info.plist中。如果您的应用程序不需要在后台运行 如果在恢复时将其恢复到初始状态,则此操作正常
会有用的。

谢谢,我可以用定时器来制作这些零件的动画,我真的没想过。这看起来更复杂,你知道我上面的方法为什么不起作用吗???
NSTimer
CADisplayLink
对于像这样的长时间运行的动画来说是更好的选择<代码>UIView动画通常是短暂的,通常是用户交互的结果。
    [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
                 }
    ];