51 votes

Afficher/masquer la barre de navigation avec une animation fluide

J'ai une application basée sur la navigation. La première vue (rootcontroller) commence avec trois gros boutons seulement. Pas de barre de navigation. À partir de là, toutes les autres vues sont des tableaux et comportent des barres de navigation. Je fais cela pour afficher/masquer la barre de navigation :

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

Dès que je quitte le contrôleur racine, la barre de navigation se met en place par à-coups et se pose sur le dessus du tableau, au lieu de le pousser vers le bas. Elle fixe la partie supérieure de la vue du tableau. Lorsque je reviens au contrôleur racine, la disparition de la barre de navigation ne se fait pas en douceur. Existe-t-il une meilleure façon de masquer la barre de navigation pour le contrôleur racine uniquement ?

118voto

James Raybould Points 4341

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

Référence

3 votes

Le fait de mélanger navigationController.navigationBar.hidden = NO avec setNavigationBarHidden donne lieu à des résultats étranges, la dissimulation ne fonctionnant pas dans mon cas. L'utilisation de l'approche unique fonctionne bien.

11voto

codeburn Points 639

Cet astucieux bout de code permet d'animer la barre de navigation en la masquant sans problème d'interface utilisateur :

[navigationController setNavigationBarHidden: YES animated:YES]

Mais...

  1. Utilisez le self.navigationController.navigationBarHidden pour les contrôles dans le code au lieu de la propriété self.navigationController.navigationBar.hidden propriété. Cela vous évitera de souffrir de problèmes inattendus de positionnement de l'interface utilisateur.
  2. Prenez soin de placer cette méthode dans - (void)viewWillAppear :(BOOL)animated 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 vilaine vue rectangulaire noire pendant les animations d'une vue qui affiche sa barre de navigation vers une vue qui ne l'affiche pas ! Par exemple, si votre vue d'accueil a sa barre de navigation cachée mais que tous ses enfants ont la barre de navigation affichée, lorsque vous passez à la vue d'accueil, l'animation affichera une barre noire à la place de la barre de navigation jusqu'à ce que l'animation soit terminée.

0 votes

Quand recommandez-vous de le faire dans le cycle de vie de la vue ?

1 votes

@Whoa : Je recommande de le faire dans la méthode 'viewWillAppear:'.

0 votes

Je ne place jamais d'événements de transition vers des éléments aussi significatifs que la barre de navigation dans viewDidLoad... Il n'est pas judicieux de le faire, surtout si les VCs de l'enfant et/ou des parents ont un renvoi interactif. Placez les animations de la barre de navigation dans viewWillAppear ou plus tard dans le cycle de vie, comme indiqué ci-dessus.

3voto

Vignesh Kumar Points 549

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 cacher une barre de navigation :

Before hide a Navigation bar:

Après avoir caché une barre de navigation :

After hide a Navigation bar:

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