Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Restore pre-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?

like image 426
Bart van den Berg Avatar asked Sep 18 '13 08:09

Bart van den Berg


2 Answers

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 
like image 53
Arne Avatar answered Oct 04 '22 08:10

Arne


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.

like image 41
ArtFeel Avatar answered Oct 04 '22 09:10

ArtFeel