Barra di navigazione mostra / nascondi


158

Ho un'app con una barra di navigazione composta da 2 pulsanti della barra. Vorrei nascondere e mostrare questa barra di navigazione quando un utente tocca due volte lo schermo.

Inizialmente, la barra di navigazione dovrebbe essere nascosta. Quando un utente tocca due volte lo schermo, la barra di navigazione dovrebbe presentare un'animazione, come quella che si può vedere nella galleria fotografica dell'iPhone.

Come posso fare qualcosa questo? I suggerimenti sono sempre apprezzati.

Risposte:


381

Questo non è qualcosa che può adattarsi a poche righe di codice, ma questo è un approccio che potrebbe funzionare per te.

Per nascondere la barra di navigazione:

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

Per mostrarlo:

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

La documentazione per questo metodo è disponibile qui .

Per ascoltare un "doppio clic" o toccare due volte, UIVieweseguire la sottoclasse e creare un'istanza di tale sottoclasse per la viewproprietà del controller della vista .

Nella sottoclasse della vista, sovrascrivi il suo -touchesEnded:withEvent:metodo e conta quanti tocchi ottieni in un determinato periodo di tempo, misurando il tempo tra due tocchi consecutivi, magari con CACurrentMediaTime(). Oppure prova il risultato da [touch tapCount].

Se si ottengono due tocchi, la vista della sottoclasse emette un segnale NSNotificationche il controller della vista ha registrato per l'ascolto.

Quando il controller di visualizzazione sente la notifica, attiva un selettore che nasconde o mostra la barra di navigazione utilizzando il codice sopra menzionato, a seconda dello stato visibile corrente della barra di navigazione, a cui si accede leggendo la isHiddenproprietà della barra di navigazione .

MODIFICARE

La parte della mia risposta per la gestione degli eventi di tocco è probabilmente utile prima di iOS 3.1. La UIGestureRecognizerclasse è probabilmente un approccio migliore per la gestione dei doppi tocchi, in questi giorni.

MODIFICA 2

Il modo rapido per nascondere la barra di navigazione è:

navigationController?.setNavigationBarHidden(true, animated: true)

Per mostrarlo:

navigationController?.setNavigationBarHidden(false, animated: true)

Se questo è per un'applicazione visualizzatore di foto, nascondere la barra di navigazione provoca uno spiacevole salto per la visualizzazione dell'immagine, che non ho trovato come prevenire. 3.2 ti consente di utilizzare UIGestureRecognizer per doppi tocchi, che è un approccio molto più ordinato (solo per iPad atm).
Paul Lynch,

Grazie mille Alex, mi hai fornito molte informazioni, seguirò le tue linee guida .. grazie
mille

lo stesso vale per le barre delle schede ??? se voglio nascondere / mostrare le barre delle schede e cosa devo fare? saluti shishir
Shishir.bobby,

1
C'è un modo per impedire questo "salto" menzionato da Paolo? Ho lo stesso problema e non so che cosa lo causi .... né penso, nessuno ci è mai imbattuto.
Icky,

Per evitare che si verifichi il "salto", è necessario reimpostare la proprietà contentInset della vista di scorrimento come menziona jclee, dopo aver nascosto / mostrato la barra di navigazione. vale a dire. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

Questo codice ti aiuterà.

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

16

Per prima cosa leggi la sezione nella Guida alla programmazione del controller di visualizzazione per iOS su "Adozione di un layout a schermo intero per le visualizzazioni di navigazione" e la sezione sulla stessa per le visualizzazioni personalizzate. Se stai provando a fare qualcosa come Photos.app, probabilmente stai usando una vista di scorrimento. Nota il commento che le barre di navigazione aggiungono automaticamente un inserto di contenuto di scorrimento alla vista di scorrimento per tenere conto dell'altezza della barra di navigazione (e della barra di stato), quindi devi ripristinare la proprietà contentInset della vista di scorrimento su zero (UIEdgeInsetsZero) subito dopo impostazione dello stato iniziale della barra di navigazione e prima che appaia la vista.

Quindi, se hai un solo tocco che attiva o disattiva la barra di navigazione e / o la barra di stato per mostrare o nascondere, devi fare due cose nel tuo metodo di attivazione / disattivazione. Il primo sembra essere quello di salvare la proprietà contentOffset della vista di scorrimento prima di modificare la proprietà nascosta NavigationBar e ripristinare il valore salvato in contentOffset subito dopo. E in secondo luogo azzerare nuovamente la proprietà contentInset in UIEdgeInsetsZero dopo aver modificato la proprietà navigationBarHidden. Inoltre, se si attiva / disattiva la barra di stato, è necessario modificarne lo stato prima di modificare lo stato della barra di navigazione.


1
Grazie mille per la nota contentOffset e contentInset. Sei il vero eroe.
Altealice,

Concordo, tu sei il vero eroe, qui! Molte grazie.
Gaetan,

9

In Swift prova questo,

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

o

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

7

Per nascondere la barra di navigazione:

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

Per mostrare la barra di navigazione:

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

In iOS 7, il completamento automatico promuove effettivamente questa soluzione rispetto a quella più votata.
Alex Zavatone,

7

Ecco una soluzione molto semplice e veloce:

self.navigationController.hidesBarsOnTap = YES;

Funzionerà con un solo tocco anziché con un doppio tocco. Inoltre cambierà il comportamento del controller di navigazione anche dopo aver premuto o visualizzato il controller di visualizzazione corrente.

È sempre possibile modificare questo comportamento nel controller all'interno di viewWillAppear: e viewWillDisappear: azioni se si desidera impostare il comportamento solo per un controller a vista singola.

Ecco la documentazione :


5

Un modo potrebbe essere deselezionando Visibilità barra "Mostra barra di navigazione" in Impostazioni attributi. Spero che questo aiuti qualcuno.

inserisci qui la descrizione dell'immagine


2

In Swift 4.2 e Xcode 10

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

Se non si desidera visualizzare la barra di navigazione solo nel 1 ° VC, ma si desidera visualizzare nella seconda parola VC onword

Nel tuo 1 ° VC scrivi questo codice.

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

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

2

Se si desidera rilevare lo stato della barra di navigazione, sia nascosta / visualizzata. Puoi semplicemente usare il seguente codice per rilevare -

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}


-4

CODICE SWIFT: funziona perfettamente per iOS 3.2 e versioni successive.

  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)

allora scrivi

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
Credo che questa sia una soluzione scadente, l'aggiunta di un gesto di tocco può, se non configurato, rimuovere i gesti su altre viste come UITableView o UICollectionView. Anche verificare se un valore booleano == true è ridondante e può indurre altri programmatori a pensare che questa sia una buona pratica. Stai anche abusando del caso di cammello e manca un tutore nel tuo esempio. Tieni presente che anche i selettori rapidi 2.2 sono stati aggiornati. Infine, swift è supportato solo su iOS 7 e versioni successive e sicuramente non funzionerà su iOS 3.2
David Rees,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.