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 voted for @Arne's answer, because I find it the most elegant solution to this problem. I would just like to add some code in order to answer to @Bill's problem from his comment on @Arne's solution. Here's comment quote:
In order to call popViewControllerRetro when back button is pressed, there's a small hack you can perform in order to achieve this. Go into your pushed view controller, import UIViewController+Retro.h and add this code in your viewWillDisappear method:
This if statement will detect when Back button is pressed and will call popViewControllerRetro from category class.
Best regards.
First of, I'm not using Storyboard. I tried using UINavigationController+Retro. For some reason, the UINavigationController is having a hard time releasing the UIViewController at the top of the stack. Here's the solution that works for me using iOS 7 custom transition.
Set delegate to self.
Declare this UINavigationControllerDelegate.
Note that it'll only get called when animated is set to YES. For example
Create the animator class extending NSObject. I called mine TransitionAnimator, which was modified from TeehanLax's TLTransitionAnimator inside UIViewController-Transitions-Example.
TransitionAnimator.h
TransitionAnimator.m
Use presenting flag to set the direction you want to animate or which ever condition you prefer. Here's the link to Apple reference.
Found another great resource to help out:
http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions
Using iOS7 TLTransitionAnimator to create custom animations
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:
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
UINavigationController+Retro.m
Simply add in:
This:
The final result: