简体   繁体   中英

UIView Animations stop working after dismiss Modal View

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";
    }
}

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.

I had the same issue. The root of my trouble was that my animation was being triggered by a notification, and I was adding an observer on each viewWillAppear, but forgot to remove in viewDidDisappear (remember that iOS 6 no longer calls viewDidUnload reliably).

Essentially, I was calling my animation function twice in quick succession, which was causing the visible irregularity. Hopefully this helps someone out down the line!

I've managed to solve this same issue in my own application.

I noticed while debugging that my UIImageViews which I was animating had different memory addresses before and after I pushed my modal view controller(s). At no other time did these UIImageViews switch their memory addresses.

I thought this might have been the root of the issue and it seems I was right.

My client's code had been allocating/initializing my View Controller's UIImageViews in -viewDidAppear instead of in -viewDidLoad. Thus, every time I launched and dismissed a modal view controller my UIImageViews I was animating would get reinitialized.

Check for yourself if your map object's memory address is changing before and after you launch your modals, and if it is be sure to move your initialization logic to a more proper section of your code.

Hope this helps you!

Dexter

I was using UIView animateWithDuration: and I solved it by not using the completion block. This is code from a subclassed UIView. In the view controller's viewWillAppear: I set self.shouldAnimate to YES, and in the view controller's viewWillDisappear: I set self.shouldAnimate to NO.

-(void)continueRotate {
  if (self.shouldAnimate) {
    [self rotateRadarView:self.radarInner];
  }
}

-(void)rotateRadarView:(UIView *)view {
  [UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(continueRotate)];
    [view setTransform:CGAffineTransformRotate(view.transform, M_PI_2)];
  }completion:nil];
}

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
    }
}

In the end, I just removed all modal views and implemented them in other ways. For some reason, using modal views messed up animations. Makes no sense, but removing them fixed the problem. If anyone can enlighten me as to why this is going on, it might be nice for memory concerns...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM