Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIView Animations stop working after dismiss Modal View

Tags:

iphone

I just upgraded my iPhone 4 from iOS 4.2.1 to 4.3.2, and to XCode 4.0.2, and I am encountering some bizarre issues with uiview animations. When I first launch my app, code like this executes perfectly:

        [UIView beginAnimations:@"fadeAlphaIn" context:nil];
    [UIView setAnimationDuration:0.5f];
    viewClue.alpha = 1.0f;
    [UIView commitAnimations];

But then, after dismissing a presenting and then dismissing a modal view by the standard method:

[self presentModalViewController:more animated:YES];

and

[self dismissModalViewControllerAnimated:YES];

the first animation no longer works. Instead of fading in, for example, the viewClue view simply jumps from alpha = 0 to alpha = 1. Similarly, other animations altering other views' frame property just force the frame to jump from the initial to final value without animation. These animations worked fine before the modal view was presented and dismissed.

I understand that others have experienced animation issues with the upgrade to iOS 4.3.2, but the way the modal view disrupts animation seems very odd. Has anyone else experienced this problem? Any ideas as to a solution? I'm thinking of just adding the modal view as a subview and animation it as it hides and appears, but using the standard modal view method would be much preferred.

Thanks for your help,

James

EDIT: Some more code showing how the app's map is animated

-(void) viewMapfunc
{
    AudioServicesPlaySystemSound(soundID);
    if(mapvisible){
        [UIView animateWithDuration:0.5 
                              delay:0.1
                            options:UIViewAnimationOptionAllowUserInteraction
                         animations:^{
                             map.frame = CGRectMake(0, 350, 320, 27);
                             mapscroll.frame = CGRectMake(0, 27, 320, 0);
                         }
                         completion:nil];

        mapvisible = NO;
        viewMapLabel.text = @"View Map";
    }else {
        [UIView animateWithDuration:0.5 
                              delay:0.1
                            options:UIViewAnimationOptionAllowUserInteraction
                         animations:^{
                             map.frame = CGRectMake(0, 50, 320, 300);
                             mapscroll.frame = CGRectMake(0, 27, 320, 300);
                         }
                         completion:nil];
        mapvisible = YES;
        viewMapLabel.text = @"Hide Map";
    }
}
like image 900
James Avatar asked Apr 24 '11 16:04

James


2 Answers

Try to check two things:

  • Do you commit all started animations? I got all kinds of strange effects after not committing one of them.
  • Do any animations take place in the same time? Especially with the same view.
  • Whether any animations take place right after changing properties. Something like:

-

view.alpha = 1;
[UIView beginAnimations:…];
view.alpha = 0;
[UIView commitAnimations:…];

In this example, view will not change it's alpha value from 1 to 0. It will change it instantly. To start an animation you have to extract animations block to another method and call it with performSelectorInMainThread:withObject:afterDelay:. Delay can be even 0.

like image 55
bealex Avatar answered Nov 01 '22 05:11

bealex


I solved it by restarting my animation in my UIView subclass:

override func willMove(toWindow newWindow: UIWindow?) {
    if newWindow != nil {
        spinner.startSpinning() // Restart any animation here
    }
}
like image 27
Antzi Avatar answered Nov 01 '22 05:11

Antzi