2010-03-05 9 views
2

Je travaille sur une application basée sur la navigation. J'ai peu de contrôleurs de vue que j'appuie sur le contrôleur de navigation à différentes occasions. Ce qui suit est le code que j'utilise pour pousser le nouveau View Controller.Désactiver l'animation de la barre de navigation

AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil]; 
[self.navigationController pushViewController:anotherViewController animated:YES]; 
[anotherViewController release]; 

Une chose que je remarque est que, lorsque le nouveau contrôleur de vue est poussé la barre de navigation aussi animée (coulissé). J'ai un bouton de retour, le texte du titre et le bouton droit dans la barre de navigation. Donc ça a l'air bizarre quand la barre de navigation est animée.

Est-il possible de conserver la barre de navigation fixe et la vue n'est animée que lorsqu'un nouveau contrôleur de vue est enfoncé?

Répondre

0

J'ai essayé beaucoup d'approches différentes, mais rien n'a fonctionné. Enfin, j'utilise une solution de contournement:

1) Remettez la vue actuelle (vue de soi) du premier contrôleur de vue au contrôleur de deuxième vue 2) Faites un pushViewController avec, par ex. une transition de fondu. Réglez le second contrôleur de vue en tant que délégué de l'animation pour informer le second contrôleur si la transition est terminée. 3) Dans viewDidLoad du deuxième contrôleur de vue, enregistrez la vue du second contrôleur de vue et réglez la vue du premier comme self. View

Maintenant, l'affichage devrait ressembler au contenu du premier contrôleur de vue avec la barre de navigation (et la barre d'outils si c'est le cas) de la seconde.

Enfin, exécutez dans le second contrôleur de vue (dans la méthode déléguée d'animation) la transition que vous souhaitez effectuer pour le contenu, par ex. retourner.

Fondamentalement, cela fonctionne. Je dois encore résoudre certains problèmes avec la position correcte de la vue et restaurer la vue dans le premier contrôleur de vue pour mon application.

Mais cela devrait vous donner au moins un indice.

Mise à jour: correction des problèmes restants. C'était un peu difficile parce que le premier contrôleur de vue réside dans un scrollview. Retournement n'était pas un gros problème, mais retourner dans une vue de défilement est une mauvaise chose.

-1

La barre de navigation se cache pendant la visualisation des images dans l'application Photo d'Apple pour offrir une meilleure vue de l'image. Masquer la barre de navigation est facile. Bien que pas exactement la même chose que l'application Photo cette technique va cacher et afficher la barre de navigation, avec une option pour animer la transition.

+1

Cela ne répond pas à la question. –

0

Swift

solution dur mais faisable:

Vous devez utiliser les méthodes UINavigationController de délégué pour savoir quand le UIViewController est affiché. Puis pour chaque UIViewController, besoin de faire une variable booléenne comme isInitialized propriété, qui vous aider à déterminer quand le UIViewController est poussé sur la pile, ou quand il est montré à l'arrière du contrôleur de vue suivante.

Votre FirstViewController:

func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       var navigationBarAnimation = CATransition() 
       navigationBarAnimation.duration = 1.5 
       navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
       navigationBarAnimation.type = kCATransitionFade 
       navigationBarAnimation.subtype = kCATransitionFade 
       navigationBarAnimation.removedOnCompletion = true 
       self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil) 
       } 
       else 
       { 
         self.isInitialized = true; 
       } 
     } 
} 

func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       self.navigationController?.navigationBar?.layer?.removeAllAnimations() 
      } 
     } 
} 

Votre SecondViewController:

func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if !self.isInitialized { 
       var navigationBarAnimation = CATransition() 
       navigationBarAnimation.duration = 1.5 
       navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
       navigationBarAnimation.type = kCATransitionFade 
       navigationBarAnimation.subtype = kCATransitionFade 
       navigationBarAnimation.removedOnCompletion = true 
       self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil) 
         self.isInitialized = true; 
       } 
     } 
} 

func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       self.navigationController?.navigationBar?.layer?.removeAllAnimations() 
      } 
     } 
} 
Questions connexes