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