2010-03-06 12 views
17

Tengo un UINavigationController con una barra de navegación visible. Tengo un UIViewController particular que me gustaría ocultar la barra de estado cuando se mete en la pila de navegación. Una vez que aparece este viewController, me gustaría volver a mostrar la barra de estado.¿Cómo obtengo la barra de navegación en un UINavigationController para actualizar su posición cuando la barra de estado está oculta?

me estoy escondiendo la barra en el método viewWillAppear de mi UIViewController así:

- (void) viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    [self.navigationController setWantsFullScreenLayout:YES]; 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];  
} 

Nota que estoy estableciendo setWantsFullScreenLayout:YES aquí para mayor claridad, pero estoy realmente sólo la creación de esta propiedad en Interface Builder .

El problema: La barra de navegación de la NavigationController no se mueve para tomar el espacio de la barra de estado oculto.

Una solución hacky La única cosa que me pareció que funcionaba para actualizar la posición de la barra de navegación era ocultar y mostrar de nuevo, como esto:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
[self.navigationController setNavigationBarHidden:YES animated:NO]; 
[self.navigationController setNavigationBarHidden:NO animated:NO]; 

pero esto es claramente un truco , Tiene que haber una mejor manera.

Otras cosas que me trataron:

  1. Traté de llamar a la [super viewWillAppear] después de ocultar la barra de estado, es decir, al final de mi método.

  2. me trataron setNeedsLayout en el navigationController.view así:

    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];  
    [self.navigationController.view setNeedsLayout]; 
    

pero eso no parece funcionar.

Cualquier ayuda apreciada. Gracias

Respuesta

10

Hay dos maneras en que puede hacer lo que está pidiendo.

Uno es para mover manualmente la barra de navegación:

En viewWillAppear:

[UIApplication sharedApplication].statusBarHidden = YES; 
    self.view.frame = [UIScreen mainScreen].applicationFrame; 
    CGRect frame = self.navigationController.navigationBar.frame; 
    frame.origin.y = 0; 
    self.navigationController.navigationBar.frame = frame; 

En viewWillDisappear:

[UIApplication sharedApplication].statusBarHidden = NO; 
    CGRect frame = self.navigationController.navigationBar.frame; 
    frame.origin.y = 20.0; 
    self.navigationController.navigationBar.frame = frame; 

Las cosas también va a estar bien si usted está dispuesto a apagar el barra de navegación también, aunque sospecho que no es lo que quería:

[UIApplication sharedApplication].statusBarHidden = YES; 
    self.navigationController.navigationBarHidden = YES; 
1

En el controlador de vista raíz (en la que desea mostrar la barra de estado):

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];; 
} 

En el controlador de vista se presiona en la pila (en la que desea ocultar la barra de estado):

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];; 
} 

Editar:

ahora me doy cuenta que desea ocultar la estadística nosotros bar. Los confundió porque estaba mostrando u ocultando la barra de navegación en el código que publicaste. Mi error.Es esencialmente el mismo código, de todos modos:

En el controlador de vista raíz (en la que desea mostrar la barra de estado):

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES]; 
} 

En el controlador de vista se presiona en la pila (en la que desea ocultar la barra de estado):

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
} 

Acabo de probar esto con un proyecto existente y funcionó.

+0

Lo que estoy tratando de ocultar se la barra de estado, no la barra de navegación. Pero me gustaría que la barra de navegación se mueva hacia arriba cuando la barra de estado esté oculta. Gracias. – eddy

+0

Reparado arriba. :) –

+0

Gracias Shaggy, El problema es que la barra de navegación no está actualizando su posición para ocupar el espacio que quedaba la barra de estado cuando estaba oculta. ¿Cómo hago para que la barra de navegación se mueva hacia arriba para llenar el espacio de la barra de estado? – eddy

2

Debe intentar cambiar el tamaño del marco de su vista UIViewControllers's después de haber ocultado la barra de estado. ApplicationFrame actualiza su origen.y size.height durante el método setStatusBarHidden:animated:.

CGRect rect = [UIScreen mainScreen].applicationFrame; 
self.view.frame = rect; 

[self.view setNeedsLayout]; 
2

me encontré con las soluciones anteriores no funcionó bastante cuando la vista se encuentra en medio de una presentación animada, así que aplazarse ocultar la barra de estado de la siguiente manera:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    // doesn't work immediately because modal view has to finish loading 
    dispatch_async(dispatch_get_main_queue(), ^(){ 
     [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
     self.view.frame = [UIScreen mainScreen].applicationFrame; 
    }); 
} 
Cuestiones relacionadas