2009-08-19 18 views
5

Sto usando un UINavigationController (nota a margine: all'interno di un UITabBar) che per impostazione predefinita offre una UINavigationBar in alto. Se nascondo la barra tramite IB, la barra non è passata solo per la root UIViewController ma anche per tutti i controller che spingo sullo stack. Lasciandomi un modo (automatico) di tornare indietro.Nascondere UINavigationBar solo per la radice UIViewController

Quindi, come nascondere UINavigtionBar solo sulla radice UIViewController. L'attivazione/disattivazione di "navigationBarHidden" temporaneamente non funziona in quanto ciò risulta scomodo con l'animazione.

Altre idee?

+0

La risposta non è esattamente quello che cercavo, ma abbastanza equo. – tcurdt

risposta

5

Io in realtà sono imbattuto in questo problema, come ho risolto è stato con il delegato UINavigationController, io fondamentalmente ho una sottoclasse UINavigationController e ne ha fatto un proprio delegato, quindi ho implementato il metodo

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if([viewController isKindOfClass: [SomeClass class]]) 
     [self setNavigationBarHidden: NO]; 
    else 
     [self setNavigationBarHidden: YES]; 
} 

Quindi si chiede che classe è e se è uno che ha bisogno di avere una barra di navigazione lo mostri, questo ha funzionato per me abbastanza bene ... spero che aiuti

+0

Questo è quello che ho provato anche io. Ma questo farà sì che la barra appaia sullo schermo e non solo sulla vista che viene animata. Certamente dovrebbe andare bene senza un'animazione. Ma io voglio l'animazione. – tcurdt

+0

?? cosa intendi? È sicuro che sia presente sullo schermo, ma appare solo quando si spinge la vista di cui si ha bisogno, anche se è animata ... qual è il problema? – Daniel

+0

Se non vuoi quell'animazione della barra stessa puoi scrivere lo stesso codice nel - navigationController: didShowViewController: animated: metodo invece, in questo modo appare solo dopo aver spinto la vista .. – Daniel

0

La mia idea sarebbe di non rendere la prima vista parte del controller di navigazione. Avere un semplice TableViewController, ad esempio, e poi quando si vuole eseguire il drill-down, creare UINavigationController e spingerlo manualmente.

Non ho provato questo e non so se funzionerà, però. È solo un'idea da provare.

+0

Sfortunatamente non funziona perché il controller di root non ha un pulsante indietro. – tcurdt

+0

Mi chiedo se potrei semplicemente fare questo e * aggiungere * un pulsante a sinistra a UINavigationBar. Dovrò provare (anche se per ora ho fatto un percorso diverso) – tcurdt

0

Hai un paio di modi diversi cattivi per farlo. Il fatto che tu sia incorporato in un controller UITAbBar in realtà complica notevolmente questo perché non c'è modo di distinguere se viewDidAppear: viene chiamato a causa del controller che viene spinto o dallo scambio delle tabulazioni, il che significa che potrebbe essere necessario nascondere i dati da qualche parte per sapere cosa sta causando la transizione e se hai bisogno di nascondere la barra o meno.

Supponendo che lo gestisci, un'opzione è di cambiare navigazioneBarHidden dopo l'animazione. Per uscire non c'è un buon posto in cui gestirlo, dal momento che vuoi che l'animazione pop avvenga dopo l'animazione della barra. La soluzione più rapida è quella di nascondere la barra, quindi eseguire manualmente il runloop per ~ 0,5 secondi finché non si anima e poi continua. È grave ma è veloce e funziona.

- (void)viewWillDisappear:(BOOL)animated { 
    if (animated) { 
    [self.navigationController.navigationBar setHidden:YES animated:YES]; 
    } 

    //GROSS 
    NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:0.5]; 
    while([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:endDate]); 
} 

Se si vuole fare in modo pulito, vi consiglio reimplementare UINavigationController da zero.

+0

Non hai bisogno di implementare nulla da zero, semplicemente sottoclasse UINavigationController sarà sufice, controlla la mia risposta. – Daniel

+0

Puoi farlo, ma a seconda di ciò che stai facendo avrai molte interazioni problematiche con le altre animazioni. UINavigationController sta programmando perché tutte saranno impegnate nello stesso momento e non hai il controllo su di esse.L'ho fatto in questo modo in passato, ma non appena ho voluto fare qualcos'altro (come le transizioni personalizzate), esso va in pezzi, ed è totalmente dipendente dalla tempistica interna di come UINavigaitionController pianifica le sue animazioni. –

8

Per me il modo più semplice per evitare lo spazio bianco dopo aver nascosto UInavigationBar è quello di nascondere o mostra la tua UInaviagtionBar come segue.

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
} 
-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
} 

con la sintassi: self.navigationController.navigationBarHidden = YES; ho sempre lo spazio bianco.

+0

I sto usando l'approccio e funziona bene per me – CVertex

Problemi correlati