2013-03-13 37 views
0

我想在应用程序启动时添加一些动画。在iPad模拟器上一切正常。但是当它在真实的iPad上运行时,框架仍然会持续一段时间,然后开始动画。在所有帧显示之前,动画完成。 这里是我的代码UIImageView的动画在真实的iOS设备上无法正常工作

- (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]; 
    }); 
+0

这些图像有多大? (像素数) – Dancreek 2013-03-14 03:42:18

+0

@Dancreek 1024×768 – 2013-03-14 04:36:06

回答

0

尝试预载图像,使得通过动画第一次当没有延迟。

+0

谢谢,但问题没有改变。 – 2013-03-14 02:11:54

+0

还有延迟 – 2013-03-14 02:12:39

+0

尝试使用imageview隐藏动画imageview,也就是说动画图像视图为0.2秒,重复次数为1秒,然后执行具有适当持续时间和重复次数的实际动画+ imageview未隐藏。 – 2013-03-14 05:02:01

2

我相信问题是你试图检测动画是否完成。 您的方法不正确,因为它仅基于对动画的估计。

该手机的CPU功耗要比使用Mac的CPU的模拟器少得多,所以在执行周围事情时速度会更慢。 所以你的动画还没有完成,当你认为它已经完成加载。此外,我不明白使用Grand Central Dispatch作为一个简单的计时器背后的逻辑,这基本上是你在做什么。

我会改变逻辑到一个简单的计时器,在那里我只是检查UIImageViewisAnimating值。

所以,摆脱这样的:

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]; 
    } 
} 
+0

谢谢,但即使在iPad模拟器上它也不起作用。 – 2013-03-14 01:20:00

0

加载38倍1024×768的图像会杀你的记忆。较新的iPad可能能够处理它,但肯定会有严重的滞后问题并可能崩溃。特别是在迷你和旧的垫上。

改为考虑一个小视频。

+0

但iPad可以播放长时间的电影,为什么它不能播放38个1024x768图像?我应该使用视频而不是图像吗? – 2013-03-15 07:48:00

+0

图像和视频是完全不同的文件。视频不会一次全部加载到内存中。 – Dancreek 2013-03-15 13:12:10

相关问题