web-dev-qa-db-fra.com

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) commence avec seulement trois gros boutons. Pas de barre de navigation. À partir de là, tout le reste est des tables et des 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 pose sur le dessus de la table, plutôt que de la pousser vers le bas. Il coupe la partie supérieure de la table. Revenir au contrôleur racine n'est pas fluide dans la façon dont la barre de navigation disparaît. Existe-t-il un moyen plus simple/plus efficace de masquer la barre de navigation pour le contrôleur racine uniquement?

51
4thSpace

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

Référence

118
James Raybould

Ce petit code astucieux anime la barre de navigation sans aucun problème d'interface utilisateur:

[navigationController setNavigationBarHidden: YES animated:YES]

Mais ...

  1. Utilisez la propriété self.navigationController.navigationBarHidden pour les vérifications du code au lieu de la propriété self.navigationController.navigationBar.hidden. Cela vous évitera beaucoup de douleur en raison de problèmes de positionnement de l'interface utilisateur inattendus.
  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 vue rectangulaire noire laide pendant les animations d'une vue qui affiche sa barre de navigation à une vue qui ne le fait pas! Par exemple, si votre vue d'accueil a sa barre de navigation masquée mais que tous ses enfants ont la barre de navigation affichée, lorsque vous passez à la vue d'accueil, l'animation affiche une barre noire à la place de la barre de navigation jusqu'à la fin de l'animation
11
codeburn

Vous pouvez personnaliser l'animation et la durée de la barre de navigation selon les méthodes suivantes. Il vous rappellera 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:

Before hide a Navigation bar:

Après avoir masqué une barre de navigation:

After hide a Navigation bar:

3
Vignesh Kumar