Afficher / masquer la barre de navigation

158

J'ai une application avec une barre de navigation composée de 2 boutons de barre. Je souhaite masquer et afficher cette barre de navigation lorsqu'un utilisateur appuie deux fois sur l'écran.

Au départ, la barre de navigation doit être masquée. Lorsqu'un utilisateur appuie deux fois sur l'écran, la barre de navigation devrait proposer une animation, comme ce que l'on peut voir dans la galerie de photos de l'iPhone.

Comment puis-je faire quelque chose? Les suggestions sont toujours appréciées.

Shishir.bobby
la source

Réponses:

381

Ce n'est pas quelque chose qui peut s'intégrer dans quelques lignes de code, mais c'est une approche qui pourrait fonctionner pour vous.

Pour masquer la barre de navigation:

[[self navigationController] setNavigationBarHidden:YES animated:YES];

Pour le montrer:

[[self navigationController] setNavigationBarHidden:NO animated:YES];

La documentation de cette méthode est disponible ici .

Pour écouter un «double-clic» ou un double-clic, sous UIView- classez et créez une instance de cette sous-classe comme viewpropriété de votre contrôleur de vue .

Dans la sous-classe de vue, remplacez sa -touchesEnded:withEvent:méthode et comptez le nombre de touches que vous obtenez dans un laps de temps, en mesurant le temps entre deux pressions consécutives, peut-être avec CACurrentMediaTime(). Ou testez le résultat à partir de [touch tapCount].

Si vous obtenez deux taps, votre vue sous-classée émet un problème NSNotificationque votre contrôleur de vue s'est enregistré pour écouter.

Lorsque votre contrôleur de vue entend la notification, il déclenche un sélecteur qui masque ou affiche la barre de navigation à l'aide du code susmentionné, en fonction de l'état visible actuel de la barre de navigation, accessible en lisant la isHiddenpropriété de la barre de navigation .

ÉDITER

La partie de ma réponse concernant la gestion des événements tap est probablement utile avant iOS 3.1. La UIGestureRecognizerclasse est probablement une meilleure approche pour gérer les doubles taps, de nos jours.

MODIFIER 2

La façon Swift de masquer la barre de navigation est:

navigationController?.setNavigationBarHidden(true, animated: true)

Pour le montrer:

navigationController?.setNavigationBarHidden(false, animated: true)
Alex Reynolds
la source
S'il s'agit d'une application de visionneuse de photos, le masquage de la barre de navigation provoque un saut désagréable pour la vue de l'image, ce que je n'ai pas trouvé comment empêcher. 3.2 vous permet d'utiliser UIGestureRecognizer pour les doubles taps, ce qui est une approche beaucoup plus soignée (pour iPad uniquement atm).
Paul Lynch
Merci beaucoup Alex, vous m'avez fourni beaucoup d'informations, je vais suivre vos directives .. merci beaucoup
Shishir.bobby
est-ce la même chose pour les barres d'onglets ??? si je veux masquer / afficher les barres d'onglets et que je dois faire? regards shishir
Shishir.bobby
1
Y a-t-il un moyen d'empêcher ce «saut» mentionné par Paul? J'ai le même problème et je ne sais pas ce qui le cause ... je ne pense pas non plus, personne n'est jamais tombé dessus.
Icky
Pour empêcher le «saut» de se produire, vous devez réinitialiser la propriété contentInset de la vue de défilement comme le mentionne jclee, après avoir masqué / affiché la barre de navigation. c'est à dire. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm
17

Ce code vous aidera.

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
{ 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)
{
// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)
{
// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}
Perjan Duro
la source
16

Lisez d'abord la section dans le Guide de programmation du contrôleur de vue pour iOS sur `` Adopter une disposition plein écran pour les vues de navigation '' et la section sur la même chose pour les vues personnalisées. Si vous essayez de faire quelque chose comme Photos.app, vous utilisez probablement une vue de défilement. Notez le commentaire selon lequel les barres de navigation ajoutent automatiquement un contenu de défilement incrusté à votre vue de défilement pour tenir compte de la hauteur de la barre de navigation (et de la barre d'état), vous devez donc réinitialiser la propriété contentInset de votre vue de défilement à zéro (UIEdgeInsetsZero) juste après configuration de l'état initial de la barre de navigation et avant l'apparition de la vue.

Ensuite, si vous avez un seul clic qui fait basculer la barre de navigation et / ou la barre d'état pour afficher ou masquer, vous devez faire deux choses dans votre méthode de basculement. Le premier semble être d'enregistrer la propriété contentOffset de la vue de défilement avant de modifier la propriété masquée NavigationBar et de restaurer votre valeur enregistrée dans contentOffset juste après. Et deuxièmement, remettre à zéro la propriété contentInset à UIEdgeInsetsZero après avoir modifié la propriété navigationBarHidden. En outre, si vous basculez la barre d'état, vous devez modifier son état avant de modifier l'état de navigationBar.

jclee
la source
1
Merci beaucoup pour la note contentOffset et contentInset. Vous le vrai héros.
Altealice
Je suis d'accord, tu es le vrai héros, ici! Merci beaucoup.
Gaetan
9

Dans Swift, essayez ceci,

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

ou

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show
Mohammad Zaid Pathan
la source
7

Pour masquer la barre de navigation:

[self.navigationController setNavigationBarHidden:YES animated:YES];

Pour afficher la barre de navigation:

[self.navigationController setNavigationBarHidden:NO animated:YES];
Jayprakash Dubey
la source
Dans iOS 7, la saisie semi-automatique fait la promotion de cette solution par opposition à la solution la plus votée.
Alex Zavatone
7

Voici une solution très simple et rapide:

self.navigationController.hidesBarsOnTap = YES;

Cela fonctionnera sur simple pression au lieu de double pression. De plus, cela changera le comportement du contrôleur de navigation même après avoir poussé ou fait sauter le contrôleur de vue actuel.

Vous pouvez toujours modifier ce comportement dans votre contrôleur dans les actions viewWillAppear: et viewWillDisappear: si vous souhaitez définir le comportement d'un seul contrôleur de vue.

Voici la documentation :

amayer171292591
la source
5

Une façon pourrait être de décocher la visibilité de la barre "Affiche la barre de navigation" dans l'inspecteur d'attributs. J'espère que cela aidera quelqu'un.

entrez la description de l'image ici

Avijit Nagare
la source
2

Dans Swift 4.2 et Xcode 10

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

Si vous ne voulez pas afficher la barre de navigation uniquement dans le 1er VC, mais que vous voulez afficher dans le 2e VC onword's

Dans votre 1er VC, écrivez ce code.

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true  //Hide
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}
iOS
la source
2

Si vous souhaitez détecter l'état de la barre de navigation si elle est masquée / affichée. Vous pouvez simplement utiliser le code suivant pour détecter -

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}
Mohammad Kamran Usmani
la source
-4

CODE SWIFT: Cela fonctionne entièrement pour iOS 3.2 et versions ultérieures.

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

puis écrire

func hideNavBarOntap() {
    if(self.navigationController?.navigationBar.hidden == false) {
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
    } else if(self.navigationController?.navigationBar.hidden == true) {
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    }
}
Kwame 'oga' Yeboah
la source
1
Je pense que c'est une mauvaise solution, l'ajout d'un geste de tapotement peut, s'il n'est pas configuré correctement, supprimer les gestes sur d'autres vues comme UITableView ou UICollectionView. Vérifier également si un booléen == true est redondant et peut amener d'autres programmeurs à penser que c'est une bonne pratique. Vous utilisez également mal l'étui de chameau et manquez une attelle d'extrémité dans votre exemple. Gardez à l'esprit que les sélecteurs swift 2.2 ont également été mis à jour. Enfin, swift n'est pris en charge que sur iOS 7 et supérieur et ne fonctionnera certainement pas sur iOS 3.2
David Rees