38 votes

Restaurer l'animation pré-iOS7 UINavigationController pushViewController

Donc. Juste commencé la transition de mon IOS code pour IOS7, et a couru dans un peu de problème.

J'ai un UINavigationController, ce qui a des enfants ViewControllers et je suis à l'aide d' pushViewController pour afficher le prochain point de vue. Pour créer une parallaxe de l'animation avec un ensemble d'images, si personnalisé l' UINavigationController l'animation d'un ensemble d' UIImageViews et mon enfant ViewControllers tous ont un self.backgroundColor = [UIColor clearColor], de la transparence.

Depuis iOS7, la façon dont l' UINavController anime enfant vc, est mis à jour, par en partie le déplacement de la vue actuelle du contrôleur et sur le dessus de pousser le nouveau viewcontroller, mon parallaxe animation de la merde. Je vois la précédente VC bouger un peu et puis disparaissent. Est il possible que je peux restaurer la version précédente, UINavigationController pushViewController animation? Je n'arrive pas à trouver dans le code.

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

Même essayé d'utiliser:

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

Quelqu'un a une idée?

46voto

Arne Points 973

J'ai réussi à contourner le nouveau type de transition en créant une catégorie pour UINavigationController . Dans mon cas, je devais revenir à l'ancien style de transition, car j'ai des viewControllers transparents qui glissent sur un arrière-plan statique.

  • 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
     

22voto

ArtFeel Points 3750

J'ai le même problème avec les couleurs de fond claires et les animations de merde, alors je crée une transition personnalisée pour ViewController avec la nouvelle API iOS7. Tout ce dont vous avez besoin, c'est tout simplement de définir un délégué pour votre contrôleur de navigation:

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

Ajoutez simplement ces fichiers dans votre projet: MGNavigationTransitioningDelegate .

18voto

Joel Points 595

J'ai eu un problème où, quand UIViewController Un fait un pushViewController de pousser UIViewController B, la poussée de l'animation s'arrête à environ 25%, l'arrêt, puis faites glisser B dans le reste de la voie.

Ce n'est PAS arrivé sur iOS 6, mais dès que j'ai commencé à utiliser iOS 7, comme étant la base SDK dans XCode 5, cela a commencé.

Le correctif est de ce point de vue contrôleur de B n'ont pas de backgroundColor situé sur sa vue de la racine (la racine de la vue est celui qui est la valeur de viewController.vue, que vous généralement définie dans loadView). La fixation d'un backgroundColor dans la racine de la vue de l'initialiseur résolu le problème.

J'ai réussi à résoudre ce comme suit:

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

}

7voto

voratima Points 119

D'abord, je ne suis pas à l'aide de Storyboard. J'ai essayé d'utiliser UINavigationController+Rétro. Pour une raison quelconque, le UINavigationController est d'avoir un moment difficile de relâcher le UIViewController en haut de la pile. Voici la solution qui fonctionne pour moi en utilisant iOS 7 de transition personnalisé.

  1. Ensemble de délégué à soi-même.

    navigationController.delegate = self;
    
  2. Déclarer ce UINavigationControllerDelegate.

    - (id<UIViewControllerAnimatedTransitioning>)navigationController (UINavigationController *)navigationController 
    animationControllerForOperation:(UINavigationControllerOperation)operation
    fromViewController:(UIViewController *)fromVC 
    toViewController:(UIViewController *)toVC 
    {
        TransitionAnimator *animator = [TransitionAnimator new]; 
        animator.presenting = YES;
        return animator;
    }
    

    Notez qu'il n'obtiendrez appelé lors de l'animation est définie sur OUI. Par exemple

    [navigationController pushViewController:currentViewController animated:YES];
    
  3. Créer l'animateur de la classe de l'extension de NSObject. J'ai appelé le mien TransitionAnimator, qui a été modifié à partir de TeehanLax de TLTransitionAnimator à l'intérieur de UIViewController-Transitions-Exemple.

    TransitionAnimator.h

    #import <Foundation/Foundation.h>
    @interface TransitionAnimator : NSObject <UIViewControllerAnimatedTransitioning>
    @property (nonatomic, assign, getter = isPresenting) BOOL presenting;
    @end
    

    TransitionAnimator.m

    #import "TransitionAnimator.h"
    @implementation TransitionAnimator
    - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext {
        return 0.5f;
    }
    - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{
        UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
        UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];    
        if (self.presenting) {
            //ANIMATE VC ENTERING FROM THE RIGHT SIDE OF THE SCREEN
            [transitionContext.containerView addSubview:fromVC.view];
            [transitionContext.containerView addSubview:toVC.view];     
            toVC.view.frame = CGRectMake(0, 0, 2*APP_W0, APP_H0); //SET ORIGINAL POSITION toVC OFF TO THE RIGHT                
            [UIView animateWithDuration:[self transitionDuration:transitionContext] 
                animations:^{
                    fromVC.view.frame = CGRectMake(0, (-1)*APP_W0, APP_W0, APP_H0); //MOVE fromVC OFF TO THE LEFT
                    toVC.view.frame = CGRectMake(0, 0, APP_W0, APP_H0); //ANIMATE toVC IN TO OCCUPY THE SCREEN
                } completion:^(BOOL finished) {
                    [transitionContext completeTransition:YES];
                }];
        }else{
            //ANIMATE VC EXITING TO THE RIGHT SIDE OF THE SCREEN
        }
    }
    @end
    

    Utiliser la présentation du drapeau à définir la direction que vous souhaitez animer ou qui à condition que vous préférez. Voici le lien pour Apple de référence.

2voto

Bart van den Berg Points 256

Merci les gars pour les commentaires. Trouvé une solution complètement recréer le UINavigationController du comportement. Quand j'avais presque fini, j'ai couru dans Nick Lockwood solution:

https://github.com/nicklockwood/OSNavigationController

OSNavigationController est un open source de re-mise en œuvre de UINavigationController. Il dispose actuellement de seulement un sous-ensemble de la fonctionnalité de UINavigationController, mais à long terme, l'objectif est de reproduire à 100% des fonctionnalités.

OSNavigationController n'est pas vraiment destiné à être utilisé comme tel. L'idée est que vous pouvez fourche et ensuite facilement personnaliser son apparence et son comportement pour répondre à toutes les exigences particulières que votre application peut avoir. Personnalisation de OSNavigationController est beaucoup plus simple que d'essayer de personnaliser UINavigationController en raison du fait que le code est ouvert et que vous n'avez pas besoin de vous soucier de méthodes privées, sans-papiers, le comportement, ou la mise en œuvre des changements entre les versions.

En substituant mon UINavigationController avec son code, j'ai pu travailler avec des images de fond dans UINavigationcontrollers

Merci!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X