iOS 7 changer direction de l'animation pushviewcontroller

Quand je pousse un viewcontroller l'animation est toujours de droite à gauche. Je veux changer cette animation à l'inverse de gauche à droite. J'ai essayé ce code mais ne marche pas. L'animation est toujours de droite à gauche. Comment puis-je réaliser ceci simplement et correctement? Besoin d'aide s'il vous plaît. Merci d'avance.

//NOT WORKING myViewController *mController = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewController"]; CATransition *transition = [CATransition animation]; transition.duration = 0.3; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionPush; transition.subtype = kCATransitionFromLeft; [self.view.layer addAnimation:transition forKey:nil]; [self.navigationController pushViewController:mController animated:YES]; 

Vous le faites réellement bien, mais autant que je comprends de votre code, vous ne surchargez pas la méthode:

 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 

Vous devez donc hériter de UINavigationController et replace la méthode ci-dessus.

Voici comment je le fais (push + pop):

Pousser:

 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{ UIView *theWindow = self.view ; if( animated ) { CATransition *animation = [CATransition animation]; [animation setDuration:0.45f]; [animation setType:kCATransitionPush]; [animation setSubtype:kCATransitionFromLeft]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; [[theWindow layer] addAnimation:animation forKey:@""]; } //make sure we pass the super "animated:NO" or we will get both our //animation and the super's animation [super pushViewController:viewController animated:NO]; [self swapButtonsForViewController:viewController]; } 

Pop:

 - (UIViewController *)popViewControllerAnimated:(BOOL)animated { UIView *theWindow = self.view ; if( animated ) { CATransition *animation = [CATransition animation]; [animation setDuration:0.45f]; [animation setType:kCATransitionPush]; [animation setSubtype:kCATransitionFromRight]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; [[theWindow layer] addAnimation:animation forKey:@""]; } return [super popViewControllerAnimated:NO]; } 

Puisque cette question mentionne iOS 7, je suis assez surpris que la réponse ne mentionne pas l'API Animated Transitions introduite dans iOS 7.

Si vous voulez entrer directement dans GitHub les gars d'objc.io ont un bon post avec un projet lié ici

Jetez un oeil à la documentation et vous verrez ce qui suit:

 @availability(iOS, introduced=7.0) optional func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? 

Ou en Objective-C

 - (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0); 

Cela signifie que depuis iOS 7, vous pouvez contrôler comment le controller de navigation implémente ses animations pour les poussées et les pops.

Tout ce dont vous avez besoin est de définir le délégué du controller de navigation et de vendre l'object d'animation correct, le cas échéant. Alors, commençons:

1. Définissez UINavigationControllerDelegate

J'aime généralement avoir un coordinateur de navigation à l'échelle de l'App qui gère toutes mes transitions, etc. Donc, idéalement, vous voulez un object qui sera vivant pendant toute la durée du NavigationController. Nous pourrions donc avoir un coordinateur qui ressemble à ceci:

 class NavigationCoordinationController: NSObject { private(set) var navigationController:UINavigationController required init(navigationController: UINavigationController) { self.navigationController = navigationController super.init() navigationController.delegate = self } } 

Je crée généralement ceci dans l'App Delegate afin qu'il puisse être référencé n'importe où. Vous pouvez également définir le délégué sur la base d'un controller par vue, en créant une sous-class UINavigationController personnalisée, ou là où vous le souhaitez.

2. Créez un animateur personnalisé

Nous avons maintenant besoin d'un object conforme au protocole UIViewControllerAnimatedTransitioning . Cet object sera appelé à appliquer l'animation chaque fois qu'une transition animée est nécessaire. Cet exemple est une animation simple qui fond et étend le fromView dans la transition, ce qui est pertinent pour un Push.

 class CustomPushExpansionTransitioner: NSObject, UIViewControllerAnimatedTransitioning { func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { return 1 } func animateTransition(transitionContext: UIViewControllerContextTransitioning) { let fromView: UIView = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! let toView: UIView = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! let container = transitionContext.containerView() container.addSubview(toView) container.bringSubviewToFront(fromView) toView.frame = container.convertRect(fromView.bounds, fromView: fromView) UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in fromView.alpha = 0 fromView.transform = CGAffineTransformConcat(fromView.transform, CGAffineTransformMakeScale(1.3, 1.3)) }) { (complete) -> Void in transitionContext.completeTransition(true) } } } 

3. Vendez l'animateur lorsque cela est nécessaire

Nous devons maintenant implémenter le délégué UINavigationController et vendre notre animateur personnalisé si nécessaire.

 extension NavigationCoordinationController: UINavigationControllerDelegate { func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { switch operation { case .Push: return LaunchToHomeTransitioner() case .Pop: break case .None: break } return nil } } 

Et voilà, vous avez maintenant un contrôle total sur vos transitions UINavigationController

 NextViewController *next = [[NextViewController alloc] initWithNibName:@"NextViewController" bundle:nil]; [UIView transitionWithView:self.navigationController.view duration:0.75 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{ [self.navigationController pushViewController:next animated:NO]; } completion:nil]; 

Essayez le code ci-dessus

vous pouvez essayer cela aussi

  CATransition* transition = [CATransition animation]; transition.duration = 0.5; transition.type = kCATransitionMoveIn; transition.subtype = kCATransitionFromLeft; [transition setTimingFunction: [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; DrawingResultsViewController *dr=[DrawingResultsViewController createAndShowProfile:YES]; [self.navigationController pushViewController:dr animated:YES]; 

Si quelqu'un cherche la même réponse dans Xamarin.iOS (basé sur la réponse gran33 ):

 public override void PushViewController(UIViewController viewController, bool animated) { if (animated) { CATransition animation = new CATransition() { Duration = 0.5, Type = CAAnimation.TransitionPush, Subtype = CAAnimation.TransitionFromTop, TimingFunction = AMediaTimingFunction.FromName(CAMediaTimingFunction.EaseInEaseOut) }; View.Layer.AddAnimation(animation, CALayer.Transition); base.PushViewController(viewController, false); } } public override UIViewController PopViewController(bool animated) { if (animated) { CATransition animation = new CATransition() { Duration = 0.5, Type = CAAnimation.TransitionPush, Subtype = CAAnimation.TransitionFromBottom, TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.EaseInEaseOut) }; View.Layer.AddAnimation(animation, CALayer.Transition); return base.PopViewController(false); } return base.PopViewController(animated); }