J'ai une application avec une barre de navigation composée de 2 boutons. Je voudrais masquer et afficher cette barre de navigation lorsqu'un utilisateur appuie deux fois sur l'écran.
Initialement, la barre de navigation devrait être masquée. Lorsqu'un utilisateur appuie deux fois sur l'écran, la barre de navigation doit proposer une animation, semblable à celle visible dans la galerie de photos de l'iPhone.
Comment puis-je faire quelque chose cela? Les suggestions sont toujours appréciées.
Ce n'est pas quelque chose qui peut entrer 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, placez la sous-classe UIView
et créez une instance de cette sous-classe de la propriété view
de votre contrôleur de vue.
Dans la sous-classe de la vue, remplacez sa méthode -touchesEnded:withEvent:
et comptez le nombre de touches touchées sur une période donnée, en mesurant le temps entre deux taps consécutifs, éventuellement avec -timeIntervalSinceDate:
. Ou testez le résultat de [touch tapCount]
.
Si vous obtenez deux taps, votre vue sous-classée émet une NSNotification
que votre contrôleur de vue a enregistrée pour l'écoute.
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 propriété isHidden
.
MODIFIER
La partie de ma réponse pour la gestion des événements de tap est probablement utile avant iOS 3.1. La classe UIGestureRecognizer
est probablement une meilleure approche pour traiter les doubles-taps, de nos jours.
EDIT 2
La manière rapide de masquer la barre de navigation est la suivante:
self.navigationController?.setNavigationBarHidden(true, animated: true)
Pour le montrer:
self.navigationController?.setNavigationBarHidden(false, animated: true)
Ce code va vous aider.
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];
}
}
Commencez par lire la section du Guide de programmation de View Controller pour iOS sur «Adoption d’une disposition plein écran pour les vues de navigation» et la section à propos de celle-ci pour les vues personnalisées. Si vous essayez de faire quelque chose comme Photos.app, vous utilisez probablement une vue par défilement. Notez que les barres de navigation ajoutent automatiquement un encadré de contenu de défilement à votre vue défilement afin de prendre en compte la hauteur de la barre de navigation (et de la barre d'état). Vous devez donc remettre à zéro la propriété contentInset de votre vue de défilement configuration de l’état initial de la barre de navigation et avant l’affichage de la vue.
Ensuite, si vous appuyez une seule fois pour afficher ou masquer la barre de navigation et/ou la barre de navigation, vous devez effectuer deux opérations dans votre méthode de basculement. La première solution semble consister à enregistrer la propriété contentOffset de la vue de défilement avant de modifier la propriété masquée NavigationBar et à restaurer votre valeur enregistrée à contentOffset immédiatement après. Et ensuite, redéfinissez la propriété contentInset sur UIEdgeInsetsZero après avoir modifié la propriété navigationBarHidden. De plus, si vous basculez la barre d'état, vous devez modifier son état avant de modifier l'état de la barre de navigation.
Dans Swift essayez ceci,
self.navigationController?.navigationBarHidden = true //Hide
self.navigationController?.navigationBarHidden = false //Show
ou
self.navigationController?.setNavigationBarHidden(true, animated: true) //Hide
self.navigationController?.setNavigationBarHidden(false, animated: true) //SHow
Pour masquer la barre de navigation:
[self.navigationController setNavigationBarHidden:YES animated:YES];
Pour afficher la barre de navigation:
[self.navigationController setNavigationBarHidden:NO animated:YES];
Voici une solution très simple et rapide:
self.navigationController.hidesBarsOnTap = YES;
Cela fonctionnera sur un robinet au lieu de toucher deux fois. De plus, cela modifiera le comportement du contrôleur de navigation même après avoir appuyé sur le contrôleur de vue actuel ou l'avoir fait apparaître.
Vous pouvez toujours modifier ce comportement dans votre contrôleur dans les actions viewWillAppear: et viewWillDisappear: si vous souhaitez définir le comportement uniquement pour un seul contrôleur de vue.
Voici la documentation :
Dans Swift 4.2 et Xcode 10
self.navigationController?.isNavigationBarHidden = true //Hide
self.navigationController?.isNavigationBarHidden = false //Show
Si vous ne souhaitez pas afficher la barre de navigation uniquement dans le 1er VC, mais que vous souhaitez afficher dans le deuxième VC onword
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
}
hidesBarsOnTap
sur la propriété UINavigationController permet de gérer cela avec iOS8 SDK