Han Pengbo
Han Pengbo

Reputation: 1436

animation of UIImageView doesn't work well on real iOS device

I want to add some animation when app is launched.Everything works well on iPad simulator.But when it runs on real iPad,the frame will be still for a while,then begin to animate. Before all frames shows,the animation is finished. Here is my code

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

Upvotes: 0

Views: 579

Answers (3)

Dancreek
Dancreek

Reputation: 9544

Loading 38 1024x768 images will kill your memory. The newer iPads might be able to handle it but there will definately be serious lag issues and possibly crashing. Especially on the mini and older pads.

Consider a small video instead.

Upvotes: 0

Lefteris
Lefteris

Reputation: 14677

I believe the problem is with the way you are trying to detect if the animation has finished. Your approach is not correct as it's just based on estimates about the animation.

The phone has much less cpu power than the emulator, which is using your Mac's CPU, so it's going to be slower at executing things around. So your animation is not yet finished, when you assume it has finished loading.

Furthermore, I don't understand the logic behind using Grand Central Dispatch as a simple timer, which is basically what you are doing.

I would change the logic to a simple timer, where I would just check the isAnimating value of the UIImageView.

So, get rid of this:

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, myAnimatedView.animationDuration * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self animationDone];
    });

and replace with this:

[self performSelector:@selector(checkAnimation) withObject:nil afterDelay:0.1];

And here is our checkAnimation function:

- (void)checkAnimation {
    if (animationView.isAnimating) {
        [self performSelector:@selector(checkAnimation) withObject:nil afterDelay:0.1];
    }
    else {
        [self animationDone];
    }
}

Upvotes: 2

arun.s
arun.s

Reputation: 1528

Try to preload images so that there is no delay when animating the first time through.

Upvotes: 0

Related Questions