La meilleure solution que j'ai trouvée est de faire ce qui suit dans le premier contrôleur de vue .
Objectif c
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
Rapide
override func viewWillAppear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
Cela entraînera l'animation de la barre de navigation depuis la gauche (avec la vue suivante) lorsque vous poussez la suivante UIViewController
sur la pile, et l'animation vers la gauche (avec l'ancienne vue), lorsque vous appuyez sur le bouton de retour sur la UINavigationBar
.
Veuillez noter également que ce ne sont pas des méthodes déléguées, vous remplacez UIViewController
l'implémentation de ces méthodes, et selon la documentation, vous devez appeler l'implémentation du super quelque part dans votre implémentation .
animated=YES
. Je sais que cela semble laidanimated=NO
, mais il semble que lorsque l'animation pour masquer la barre de navigation n'est pas encore terminée, l'animation pour la montrer à nouveau est ignorée. Pas encore de solution.Une autre approche que j'ai trouvée consiste à définir un délégué pour
NavigationController
:et utiliser
setNavigationBarHidden
dansnavigationController:willShowViewController:animated:
Un moyen facile de personnaliser le comportement de chacun
ViewController
en un seul endroit.la source
Un léger ajustement que j'ai dû apporter aux autres réponses consiste à afficher la barre dans viewWillDisappear uniquement si la raison de sa disparition est due à un élément de navigation poussé dessus. En effet, la vue peut disparaître pour d'autres raisons.
Je ne dévoile donc la barre que si cette vue n'est plus la plus haute:
la source
Je mettrais le code dans le délégué viewWillAppear sur chaque vue affichée:
Comme ça où vous devez le cacher:
Comme ça où vous devez le montrer:
la source
La réponse actuellement acceptée ne correspond pas au comportement souhaité décrit dans la question. La question demande que la barre de navigation soit masquée sur le contrôleur de vue racine, mais visible partout ailleurs, mais la réponse acceptée masque la barre de navigation sur un contrôleur de vue particulier. Que se passe-t-il lorsqu'une autre instance du premier contrôleur de vue est poussée sur la pile? Il masquera la barre de navigation même si nous ne regardons pas le contrôleur de vue racine.
Au lieu de cela, la stratégie de @Chad M. d'utiliser le
UINavigationControllerDelegate
est bonne, et voici une solution plus complète. Pas:UINavigationController
-navigationController:willShowViewController:animated
méthode pour afficher ou masquer la barre de navigation selon qu'elle affiche le contrôleur de vue racineLe code complet de cette solution se trouve dans ce Gist . Voici l'
navigationController:willShowViewController:animated
implémentation:la source
dans Swift 3:
la source
navcontroller.navagationBarHidden
il cassera tout le contrôleur de navigation (pas de glisser d'avant en arrière). Pour le faire fonctionner, j'ai utilisé à lanavigationController?.navigationBar.hidden
place. Le balayage fonctionne toujours et ne laisse pas d'espace vide car il semble être à l'intérieur d'une vue de pile ou quelque choseDonne mon crédit à la réponse de @ chad-m.
Voici la version Swift:
MyNavigationController.swift
Différence entre la réponse de chad-m et la mienne:
Héritez de UINavigationController pour ne pas polluer votre rootViewController.
utilisez
self.viewControllers.first
plutôt quehomeViewController
, donc vous ne ferez pas cela 100 fois pour vos 100 UINavigationControllers dans 1 StoryBoard.la source
Après plusieurs essais, voici comment je l'ai fait fonctionner pour ce que je voulais. Voilà ce que j'essayais. - J'ai une vue avec une image. et je voulais que l'image passe en plein écran. - J'ai aussi un contrôleur de navigation avec une tabBar. Je dois donc cacher ça aussi. - De plus, ma principale exigence n'était pas seulement de se cacher, mais aussi d'avoir un effet de décoloration lors de l'affichage et de la dissimulation.
C'est ainsi que je l'ai fait fonctionner.
Étape 1 - J'ai une image et l'utilisateur appuie une fois sur cette image. Je capture ce geste et le pousse dans le nouveau
imageViewController
, c'est dans leimageViewController
, je veux avoir une image plein écran.Étape 2 - Toutes ces étapes ci-dessous sont dans ImageViewController
Étape 2.1 - Dans ViewDidLoad, affichez la barre de navigation
Étape 2.2 - Dans
viewDidAppear
, configurez une tâche de minuterie avec retard (je l'ai définie pour un délai de 1 seconde). Et après le délai, ajoutez un effet de décoloration. J'utilise alpha pour utiliser la décoloration.étape 2.3 - Sous
viewWillAppear
, ajoutez un geste singleTap à l'image et rendez la barre de navigation translucide.Étape 3 - Enfin
viewWillDisappear
, assurez-vous de remettre tous les trucsla source
Si quelqu'un a encore des problèmes avec le bug d'annulation de balayage rapide comme @fabb l'a commenté dans la réponse acceptée.
Je parviens à résoudre ce problème en outrepassant
viewDidLayoutSubviews
,viewWillAppear/viewWillDisappear
comme indiqué ci-dessous:Dans mon cas, je remarque que c'est parce que le contrôleur de vue racine (où nav est caché) et le contrôleur de vue poussé (nav est affiché) ont différents styles de barre d'état (par exemple sombre et clair). Au moment où vous démarrez le balayage arrière pour faire apparaître le contrôleur de vue, il y aura une animation de couleur de barre d'état supplémentaire. Si vous relâchez votre doigt pour annuler la pop interactive, alors que l'animation de la barre d'état n'est pas terminée , la barre de navigation a disparu pour toujours!
Cependant, ce bogue ne se produit pas si les styles de barre d'état des deux contrôleurs de vue sont identiques.
la source
Si vous voulez masquer complètement la barre de navigation dans le contrôleur, une solution beaucoup plus propre consiste à avoir, dans le contrôleur racine, quelque chose comme:
Lorsque vous poussez une vue enfant dans le contrôleur, la barre de navigation reste masquée; si vous souhaitez l'afficher uniquement dans l'enfant, vous ajouterez le code pour l'afficher
it(self.navigationController.navigationBarHidden=NO;)
dans leviewWillAppear
rappel, et de même le code pour le masquerviewWillDisappear
la source
La mise en œuvre la plus simple peut consister à demander à chaque contrôleur de vue de spécifier si sa barre de navigation est masquée ou non dans sa
viewWillAppear:animated:
méthode. La même approche fonctionne bien pour masquer / afficher la barre d'outils:la source
Masquer la barre de navigation uniquement sur la première page peut également être réalisé via le storyboard. Sur le storyboard, goto Navigation Controller Scene-> Navigation Bar . Et sélectionnez la propriété ' Hidden ' dans l' inspecteur Attributs . Cela masquera la barre de navigation à partir du premier viewcontroller jusqu'à ce qu'elle soit visible pour le viewcontroller requis.
La barre de navigation peut être redéfinie comme visible dans le rappel ViewWillAppear de ViewController.
la source
Swift 4:
Dans le contrôleur de vue, vous souhaitez masquer la barre de navigation.
la source
En implémentant ce code dans votre ViewController, vous pouvez obtenir cet effet. En fait, l'astuce est de masquer la barre de navigation lorsque ce contrôleur est lancé
et afficher la barre de navigation lorsque l'utilisateur quitte cette page faire ceci est viewWillDisappear
la source