Affichage / masquage de la barre de navigation avec une animation fluide

J’ai une application basée sur la navigation. La première vue (rootcontroller) ne commence que par trois gros boutons. Pas de barre de navigation. À partir de là, tout le rest est constitué de tables et de barres de navigation. Je fais cela pour afficher / masquer la barre de navigation:

MyAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDelegate.navigationController.navigationBar.hidden = NO; 

Une fois que je quitte le contrôleur racine, la barre de navigation se met en place et se place sur la table plutôt que de la pousser vers le bas. Il coupe la partie supérieure de la tableview. Revenir au contrôleur racine n’est pas fluide dans la manière dont la barre de navigation disparaît. Existe-t-il un moyen plus simple / plus efficace de masquer la barre de navigation du contrôleur racine uniquement?

Vous pouvez utiliser [navigationController setNavigationBarHidden:YES animated:YES] pour masquer la barre en douceur.

Référence

Ce code astucieux anime le masquage de la barre de navigation sans problèmes d’interface:

[navigationController setNavigationBarHidden: YES animated:YES]

Mais…

  1. Utilisez la propriété self.navigationController.navigationBarHidden pour les vérifications dans le code au lieu de la propriété self.navigationController.navigationBar.hidden . Cela vous évitera beaucoup de problèmes dus à des problèmes de positionnement imprévus.
  2. Veillez à placer cette méthode dans – (void) viewWillAppear: (BOOL) animé ou plus tard dans le cycle de vie de la vue. Ceci est recommandé car si vous le faites dans – (void) viewDidLoad par exemple, vous obtiendrez une vue rectangular noire moche lors des animations depuis une vue qui affiche sa barre de navigation vers une vue qui ne le fait pas! Par exemple, si la barre de navigation de votre vue d’accueil est masquée mais que la barre de navigation de tous ses enfants est affichée, l’animation affiche une barre noire à la place de la barre de navigation jusqu’à la fin de l’animation

Vous pouvez personnaliser l’animation et la durée de la barre de navigation à l’aide des méthodes suivantes. Il vous fournira un rappel une fois l’animation terminée.

  // pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion - (void)setNavigationBarVisible:(BOOL)visible animated:(BOOL)animated completion:(void (^)(BOOL))completion { // fail if the current state matches the desired state if ([self navigationBarIsVisible] == visible) return completion(YES); // get a frame calculation ready CGFloat nheight = self.navigationController.navigationBar.frame.size.height; CGFloat noffsetY = (visible)? -nheight : nheight; // zero duration means no animation CGFloat duration = (animated)? 0.3 : 0.0; [UIView animateWithDuration:duration animations:^{ CGRect nframe = self.navigationController.navigationBar.frame; self.navigationController.navigationBar.frame = CGRectOffset(nframe, 0, noffsetY); } completion:completion]; } // know the current state of the navigation bar - (BOOL)navigationBarIsVisible { return self.navigationController.navigationBar.frame.origin.y < CGRectGetMinY(self.view.frame); } // Show or Hide navigation bar [self setNavigationBarVisible:![self navigationBarIsVisible] animated:YES completion:^(BOOL finished) { NSLog(@"navigation bar finished"); }]; 

Avant de masquer une barre de navigation:

Avant de masquer une barre de navigation:

Après avoir masqué une barre de navigation:

Après avoir masqué une barre de navigation: