我想添加一些动画,当应用程序是launched.Everything在iPad simulator.But上运行得很好时,当它在真正的iPad上运行时,帧将静止一段时间,然后开始动画。在显示所有帧之前,动画已完成。以下是我的代码
- (void)viewDidAppear:(BOOL)animated
{
NSArray *myImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"1.png"],
[UIImage imageNamed:@"2.png"],
[UIImage imageNamed:@"3.png"],
[UIImage imageNamed:@"4.png"],
[UIImage imageNamed:@"5.png"],
[UIImage imageNamed:@"6.png"],
[UIImage imageNamed:@"7.png"],
[UIImage imageNamed:@"8.png"],
[UIImage imageNamed:@"9.png"],
[UIImage imageNamed:@"10.png"],
[UIImage imageNamed:@"11.png"],
[UIImage imageNamed:@"12.png"],
[UIImage imageNamed:@"13.png"],
[UIImage imageNamed:@"14.png"],
[UIImage imageNamed:@"15.png"],
[UIImage imageNamed:@"16.png"],
[UIImage imageNamed:@"17.png"],
[UIImage imageNamed:@"18.png"],
[UIImage imageNamed:@"19.png"],
[UIImage imageNamed:@"20.png"],
[UIImage imageNamed:@"21.png"],
[UIImage imageNamed:@"22.png"],
[UIImage imageNamed:@"23.png"],
[UIImage imageNamed:@"24.png"],
[UIImage imageNamed:@"25.png"],
[UIImage imageNamed:@"26.png"],
[UIImage imageNamed:@"27.png"],
[UIImage imageNamed:@"28.png"],
[UIImage imageNamed:@"29.png"],
[UIImage imageNamed:@"30.png"],
[UIImage imageNamed:@"31.png"],
[UIImage imageNamed:@"32.png"],
[UIImage imageNamed:@"33.png"],
[UIImage imageNamed:@"34.png"],
[UIImage imageNamed:@"35.png"],
[UIImage imageNamed:@"36.png"],
[UIImage imageNamed:@"37.png"],
[UIImage imageNamed:@"38.png"],
nil];
//myAnimatedView is UIImageView outlet
myAnimatedView.animationImages = myImages;
myAnimatedView.animationDuration = 3;
myAnimatedView.animationRepeatCount = 1;
[myAnimatedView startAnimating];
//trigger animationDone method when animation is finished
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, myAnimatedView.animationDuration * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self animationDone];
});
发布于 2013-03-13 09:27:17
我认为问题出在您试图检测动画是否已完成的方式上。你的方法是不正确的,因为它只是基于对动画的估计。
手机的cpu能力比模拟器低得多,模拟器使用的是Mac的CPU,所以在执行周围的事情时会更慢。因此,当您假定动画已完成加载时,动画尚未完成。
此外,我不明白使用中央调度中心作为一个简单的计时器背后的逻辑,这基本上就是你正在做的。
我会将逻辑更改为一个简单的计时器,在这个计时器中,我将只检查UIImageView
的isAnimating
值。
所以,把这个去掉:
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, myAnimatedView.animationDuration * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self animationDone];
});
并替换为以下内容:
[self performSelector:@selector(checkAnimation) withObject:nil afterDelay:0.1];
下面是我们的checkAnimation函数:
- (void)checkAnimation {
if (animationView.isAnimating) {
[self performSelector:@selector(checkAnimation) withObject:nil afterDelay:0.1];
}
else {
[self animationDone];
}
}
发布于 2013-03-13 09:03:36
尝试预加载图像,以便在第一次设置动画时不会出现延迟。
发布于 2013-03-14 13:16:02
加载38张1024x768的图像会耗尽你的记忆力。较新的iPads可能能够处理它,但肯定会有严重的滞后问题,甚至可能崩溃。特别是在迷你和老式的垫子上。
考虑一个小视频。
https://stackoverflow.com/questions/15379609
复制