2010-05-28 9 views
140

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.Barre de navigation afficher/masquer

Initialement, la barre de navigation devrait être cachée. Lorsqu'un utilisateur tape deux fois sur l'écran, la barre de navigation devrait proposer une animation, comme ce qui peut être vu dans la galerie de photos de l'iPhone.

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

Répondre

353

Ce n'est pas quelque chose qui peut tenir 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]; 

Documentation pour cette méthode est available here.

Pour écouter un "double-clic" ou un double-clic, sous-classe UIView et créez une instance de cette sous-classe pour la propriété view de votre contrôleur de vue.

Dans la sous-classe vue, remplacez sa méthode -touchesEnded:withEvent: et comptez combien de touches vous obtenez dans une période de temps, en mesurant le temps entre deux prises consécutives, peut-être avec -timeIntervalSinceDate:. Ou testez le résultat à [touch tapCount].

Si vous obtenez deux taps, votre vue sous-classée émet un 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 affiche la barre de navigation en utilisant le code susmentionné, en fonction de l'état visible actuel de la barre de navigation, accessible via la propriété isHidden de la barre de navigation.

EDIT

La partie de ma réponse pour la gestion des événements du robinet est probablement utile de retour avant iOS 3.1. La classe UIGestureRecognizer est probablement une meilleure approche pour gérer les doubles taps, ces jours-ci.

EDIT 2

La façon dont Swift pour cacher la barre de navigation est:

self.navigationController?.setNavigationBarHidden(true, animated: true) 

Pour le montrer:

self.navigationController?.setNavigationBarHidden(false, animated: true) 
+0

Si cela est une application de visionneuse de photos, cacher la barre de navigation provoque un saut désagréable pour l'image vue, 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 simple (pour iPad uniquement atm). –

+0

Merci beaucoup Alex, je vous ai fourni beaucoup d'infoemation, je vais suivre vos directives .. merci une tonne – iscavengers

+0

est-ce la même chose appliquée pour les bars à onglets ??? si je veux cacher/afficher les barres d'onglet dan wat i hv à faire? salutations shishir – iscavengers

14

Tout d'abord, veuillez lire la section dans la programmation du contrôleur View Guide pour iOS sur 'Adopter une mise en page en plein écran pour les vues de navigation' et la section à peu près la même pour les affichages personnalisés. Si vous essayez de faire quelque chose comme Photos.app, vous utilisez probablement une vue déroulante. Notez que les barres de navigation ajoutent automatiquement un contenu de défilement à 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 remettre à zéro la propriété contentInset de votre vue défilante (UIEdgeInsetsZero) configurer l'état initial de navigationBar et avant que la vue ne s'affiche.

Ensuite, si vous n'avez qu'un seul appui pour basculer entre la barre de navigation et/ou la barre d'état pour afficher ou masquer, vous devez effectuer deux opérations dans la méthode de basculement. La première semble être d'enregistrer la propriété contentOffset de la vue de défilement avant de modifier la propriété cachée NavigationBar et de restaurer votre valeur enregistrée dans contentOffset juste après. Et deuxièmement pour mettre à 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.

+0

Merci beaucoup pour la note contentOffset et contentInset. Toi le vrai héros. – Altealice

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]; 
} 
} 
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]; 
+0

Dans iOS 7, l'auto-complétion promeut réellement cette solution plutôt que la plus haute. –

9

Dans Swift essayer cela,

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 
5

Voici une solution très rapide et simple:

self.navigationController.hidesBarsOnTap = YES; 

Cela fonctionne sur simple pression du doigt au lieu de taper deux fois. En outre, cela modifiera le comportement du contrôleur de navigation même après avoir poussé ou ouvert 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 uniquement pour un seul contrôleur de vue.

Voici le documentation:

-2

SWIFT CODE: Cela fonctionne parfaitement 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 
    } 
} 
+1

Je crois que c'est une mauvaise solution, l'ajout d'un geste de robinet peut, si elle n'est pas configurée correctement, supprimer les gestes sur d'autres vues comme UITableView ou UICollectionView. Vérifier également si un booléen == vrai est redondant et peut amener d'autres programmeurs à penser que c'est une bonne pratique. Vous abusez également de l'étui à chameaux et vous manquez un contreventement dans votre exemple. N'oubliez pas que les sélecteurs swift 2.2 ont également été mis à jour. Enfin, swift n'est pris en charge que sur iOS 7 et versions ultérieures et ne fonctionnera certainement pas sur iOS 3.2 –

2

Une façon pourrait être en décochant Bar visibilité "Affiche la barre de navigation" dans l'attribut Inspector.Hope Cette personne aide.

enter image description here