iOS7 UINavigationController pushViewController animation

So. Just started transitioning my IOS code to IOS7, and ran into a bit of problem.

I've got a UINavigationController , which has child ViewControllers and I'm using pushViewController to display the next views. To create a parallax animation with a set of images, if customized the UINavigationController to animate a set of UIImageViews and my child ViewControllers all have a self.backgroundColor = [UIColor clearColor] , transparency.

Since iOS7, the way the UINavController animates it child vc's, is updated, by partially moving the current view controller and on top pushing the new viewcontroller, my parallax animation looks crap. I see the previous VC move a bit and then disappear. Is there any way I can restore the previous UINavigationController pushViewController animation? I can't seem to find this in the code.

WelcomeLoginViewController* welcomeLoginViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"WelcomeLogin"];
    [self.navigationController pushViewController:welcomeLoginViewController animated:YES];    

Even tried using:

    [UIView animateWithDuration:0.75
                     animations:^{
                         [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                         [self.navigationController pushViewController:welcomeLoginViewController animated:NO];
                         [UIView setAnimationTransition:<specific_animation_form> forView:self.navigationController.view cache:NO];
                     }];

Does anyone have any clue?


I managed to workaround the new transition type by creating a category for UINavigationController . In my case I needed to revert it to the old transition style because I have transparent viewControllers that slide over a static background.

  • UINavigationController+Retro.h

    @interface UINavigationController (Retro)
    
    - (void)pushViewControllerRetro:(UIViewController *)viewController;
    - (void)popViewControllerRetro;
    
    @end
    
  • UINavigationController+Retro.m

    #import "UINavigationController+Retro.h"
    
    @implementation UINavigationController (Retro)
    
    - (void)pushViewControllerRetro:(UIViewController *)viewController {
        CATransition *transition = [CATransition animation];
        transition.duration = 0.25;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionPush;
        transition.subtype = kCATransitionFromRight;
        [self.view.layer addAnimation:transition forKey:nil];
    
        [self pushViewController:viewController animated:NO];
    }
    
    - (void)popViewControllerRetro {
        CATransition *transition = [CATransition animation];
        transition.duration = 0.25;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionPush;
        transition.subtype = kCATransitionFromLeft;
        [self.view.layer addAnimation:transition forKey:nil];
    
        [self popViewControllerAnimated:NO];
    }
    
    @end
    

  • I have the same problem with clear background colors and crappy animations, so I create custom transitioning for ViewController with new iOS7 API. All you need is simply set a delegate for your navigation controller:

    // NavigationController does not retain delegate, so you should hold it.
    self.navigationController.delegate = self.navigationTransitioningDelegate;
    

    Just add this files into your project: MGNavigationTransitioningDelegate.


    I had a problem where when UIViewController A did a pushViewController to push UIViewController B, the push animation would stop at about 25%, halt, and then slide B in the rest of the way.

    This DID NOT happen on iOS 6, but as soon as I started using iOS 7 as the base SDK in XCode 5, this started happening.

    The fix is that view controller B did not have a backgroundColor set on its root view (the root view is the one that is the value of viewController.view, that you typically set in loadView). Setting a backgroundColor in that root view's initializer fixed the problem.

    I managed to fix this as follows:

    // CASE 1: The root view for a UIViewController subclass that had a halting animation
    
    - (id)initWithFrame:(CGRect)frame
    
    {
    
         if ((self = [super initWithFrame:frame])) {
    
              // Do some initialization ...
    
              // self.backgroundColor was NOT being set
    
              // and animation in pushViewController was slow and stopped at 25% and paused
    
         }
    
         return self;
    
    }
    
    // CASE 2: HERE IS THE FIX
    
    - (id)initWithFrame:(CGRect)frame
    
    {
    
         if ((self = [super initWithFrame:frame])) {
    
              // Do some initialization ...
    
              // Set self.backgroundColor for the fix!
    
              // and animation in pushViewController is no longer slow and and no longer stopped at 25% and paused
    
              self.backgroundColor = [UIColor whiteColor]; // or some other non-clear color
    
         }
    
         return self;
    
    }
    
    链接地址: http://www.djcxy.com/p/90326.html

    上一篇: ios7 NSInvalidArgumentException呈现UIPopoverController

    下一篇: iOS7 UINavigationController pushViewController动画