162 votes

Barre de navigation afficher/masquer

J'ai une application avec une barre de navigation composée de 2 boutons de barre. Je voudrais masquer et afficher cette barre de navigation lorsque l'utilisateur double-clique sur l'écran.

Initialement, la barre de navigation doit être masquée. Lorsqu'un utilisateur double-clique sur l'écran, la barre de navigation doit apparaître avec une animation, comme ce qui peut être vu dans la galerie de photos de l'iPhone.

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

389voto

Alex Reynolds Points 45039

Ce n'est pas quelque chose qui peut tenir dans quelques lignes de code, mais voici une approche qui pourrait fonctionner pour vous.

Pour masquer la barre de navigation :

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

Pour la montrer :

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

La documentation pour cette méthode est disponible ici.

Pour écouter un "double-clic" ou double-tap, sous-classez UIView et faites une instance de cette sous-classe votre propriété view du contrôleur de vue.

Dans la sous-classe de vue, remplacez sa méthode -touchesEnded:withEvent: et comptez combien de pressions vous recevez dans une durée déterminée, en mesurant le temps entre deux tapes consécutives, peut-être avec CACurrentMediaTime(). Ou testez le résultat de [touch tapCount].

Si vous obtenez deux tapes, votre vue sous-classée émet une NSNotification que votre contrôleur de vue a enregistré pour écouter.

Lorsque votre contrôleur de vue entend la notification, il déclenche un sélecteur qui cache ou montre la barre de navigation en utilisant le code mentionné ci-dessus, selon l'état visible actuel de la barre de navigation, accessible en lisant la propriété isHidden de la barre de navigation.

ÉDITION

La partie de ma réponse pour gérer les événements de tap est probablement utile avant iOS 3.1. La classe UIGestureRecognizer est probablement une meilleure approche pour gérer les double-taps de nos jours.

ÉDITION 2

La manière Swift de cacher la barre de navigation est :

navigationController?.setNavigationBarHidden(true, animated: true)

Pour la montrer :

navigationController?.setNavigationBarHidden(false, animated: true)

0 votes

Si cela est pour une application de visualisation de photos, masquer la barre de navigation provoque un saut désagréable pour la vue de l'image, que je n'ai pas trouvé comment empêcher. La version 3.2 vous permet d'utiliser UIGestureRecognizer pour les doubles clics, ce qui est une approche beaucoup plus élégante (pour iPad uniquement pour le moment).

0 votes

Merci beaucoup Alex, tu m'as fourni beaucoup d'informations, je vais suivre tes conseils .. merci un million

0 votes

Est-ce que cela s'applique également aux barres d'onglets??? Si je veux cacher / afficher les barres d'onglets, que dois-je faire? Cordialement, Shishir

17voto

Perjan Duro Points 135

Ce code vous aidera.

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

-(void) showHideNavbar:(id) sender 
{ 
// écrire le code pour afficher/masquer la barre de navigation ici
// vérifier si la barre de navigation est affichée
if (self.navigationController.navigationBar.hidden == NO)
{
// masquer la barre de navigation
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// si la barre de navigation est déjà masquée
else if (self.navigationController.navigationBar.hidden == YES)
{
// afficher la barre de navigation
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}

16voto

jclee Points 71

Tout d'abord, lisez la section du Guide de programmation du contrôleur de vue pour iOS sur 'Adopter une mise en page 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 l'application Photos, vous utilisez probablement une vue défilante. Notez le commentaire selon lequel les barres de navigation ajoutent automatiquement un décalage du contenu de défilement à votre vue défilante pour prendre en compte la hauteur de la barre de navigation (et de la barre d'état), vous devez réinitialiser la propriété contentInset de votre vue défilante à zéro (UIEdgeInsetsZero) juste après avoir configuré l'état initial de la barre de navigation et avant que la vue n'apparaisse.

Ensuite, si vous avez un appui simple qui bascule la barre de navigation et/ou la barre d'état pour les afficher ou les masquer, vous devez faire deux choses dans votre méthode de bascule. La première semble être de sauvegarder la propriété contentOffset de la vue défilante avant de changer la propriété cachée de la barre de navigation et de restaurer votre valeur sauvegardée à contentOffset juste après. Et deuxièmement, à nouveau mettre à zéro la propriété contentInset à UIEdgeInsetsZero après avoir changé la propriété de navigationBarHidden. De plus, si vous basculez la barre d'état, vous devez changer son état avant de changer l'état de la barre de navigation.

1 votes

Merci beaucoup pour la note contentOffset et contentInset. Tu es le vrai héros.

0 votes

Je suis d'accord, tu es le vrai héros, ici ! Merci beaucoup.

11voto

Zaid Khan Points 15

Dans Swift, essayez ceci,

navigationController?.isNavigationBarHidden = true  //Cacher
navigationController?.isNavigationBarHidden = false //Afficher

ou

navigationController?.setNavigationBarHidden(true, animated: true) //Cacher
navigationController?.setNavigationBarHidden(false, animated: true) //Afficher

7voto

amayer171292591 Points 200

Voici une solution très rapide et simple:

self.navigationController.hidesBarsOnTap = YES;

Cela fonctionnera sur un simple tap au lieu d'un double tap. De plus, cela modifiera le comportement du contrôleur de navigation même après avoir poussé ou retiré le contrôleur de vue actuel.

Vous pouvez toujours modifier ce comportement dans votre contrôleur à l'intérieur des actions viewWillAppear: et viewWillDisappear: si vous souhaitez définir le comportement uniquement pour un seul contrôleur de vue.

Voici la documentation:

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