Restore pre-iOS7 UINavigationController pushViewController animation Restore pre-iOS7 UINavigationController pushViewController animation objective-c objective-c

Restore pre-iOS7 UINavigationController pushViewController animation


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