2009-08-19 22 views
5

estoy usando un UINavigationController (nota: en el interior de un UITabBar) que por defecto le da una UINavigationBar en la parte superior. Si oculto la barra a través de IB, la barra desaparecerá no solo para el UIViewController raíz sino también para todos los controladores que coloque en la pila. No me deja una forma (automática) de volver atrás.ocultar la UINavigationBar sólo para el UIViewController raíz

Entonces, ¿cómo puede ocultar la UINavigtionBar sólo en el UIViewController raíz. Encender/apagar "navigationBarHidden" temporalmente no funciona, ya que parece incómodo con la animación.

¿Alguna otra idea?

+0

La respuesta no es exactamente lo que buscaba, pero es suficiente. – tcurdt

Respuesta

5

realidad me encontré con este problema, cómo resolví que era con el delegado UINavigationController, Tengo básicamente una subclase UINavigationController y lo hizo su propio delegado, entonces yo implementado el método

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

Así que te preguntas cuales clase es y si es uno que necesita tener una barra de navegación que se muestra, esto funcionó bastante bien ... espero que ayude

+0

Eso es lo que intenté, también. Pero eso permitirá que la barra aparezca en la pantalla y no solo en la vista que se anima. Sin duda, debería estar bien sin una animación. Pero quiero la animación. – tcurdt

+0

?? ¿Qué quieres decir? Está en la pantalla seguro, pero solo aparece cuando presionas la vista que necesitas, incluso si está animada ... ¿cuál es el problema? – Daniel

+0

Si no desea esa animación de la barra en sí, puede escribir el mismo código en el método - navigationController: didShowViewController: animado: en su lugar, aparece solo después de presionar la vista ... – Daniel

0

Mi idea sería no haga que su primera vista sea parte del controlador de navegación. Tenga un TableViewController simple, por ejemplo, y luego, cuando desee profundizar, cree el UINavigationController y presione su vista de forma manual.

No he probado esto y no sé si va a trabajar, sin embargo. Solo una idea para probar.

+0

Desafortunadamente eso no funciona porque el controlador raíz no tiene un botón de retroceso. – tcurdt

+0

Me pregunto si podría hacer esto y * agregar * un botón a la izquierda de UINavigationBar. Tendré que intentarlo (aunque por el momento fui por una ruta diferente) – tcurdt

0

usted tiene un par de maneras diferentes desagradables en que puede hacerlo. El hecho de que esté incrustado en un controlador UITAbBar realmente complica esto porque no hay forma de distinguir si se llama a viewDidAppear: debido al controlador que se está presionando o al intercambio de pestañas, lo que significa que es posible que necesite ocultar datos en algún lugar para saber qué está causando la transición y si necesita ocultar la barra o no.

Suponiendo que manejes eso, una opción es cambiar la navegaciónBarHidden después de que hayas animado. Al salir no hay un buen lugar para manejar eso ya que quieres que la animación pop suceda después de que la barra se anima. La solución más rápida es ocultar la barra y luego ejecutar manualmente tu runloop durante ~ 0.5 segundos hasta que se anime y luego continuar. Es asqueroso, pero es rápido y funciona.

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

Si desea hacerlo limpiamente, recomiendo reimplementar UINavigationController desde cero.

+0

No necesita implementar nada desde cero, simplemente la subclase UINavigationController será suficiente, vea mi respuesta. – Daniel

+0

Usted puede hacer eso, pero dependiendo de lo que está haciendo obtendrá una gran cantidad de interacciones problemáticas con las otras animaciones UINavigationController es la programación debido a que todos ellos serán comprometidos al mismo tiempo y no tiene control sobre ellos.Lo hice de esa manera en el pasado, pero tan pronto como quise hacer algo más (como las transiciones personalizadas) se desmorona, y es totalmente dependiente de la sincronización interna de cómo UINavigaitionController programa sus animaciones. –

8

Para mí, la forma más fácil de evitar el espacio en blanco después de ocultar UInavigationBar es ocultar o muestre su UInaviagtionBar como sigue.

-(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 sintaxis: self.navigationController.navigationBarHidden = YES; siempre tengo el espacio en blanco.

+0

I Estoy usando el enfoque y me funciona bien – CVertex

Cuestiones relacionadas