2010-11-20 12 views
14

Estoy intentando hacer una interfaz similar a la de la aplicación Fotos donde la barra de navegación de la barra de estado & se desvanece, pero me está saliendo un problema. Si toco para ocultar la interfaz, gire el dispositivo, luego toque para volver a subir, luego la barra de navegación se reposiciona debajo de la barra de estado (ver foto). Si giro el dispositivo, la barra de navegación regresa a su lugar correcto. ¿Cómo puedo arreglar esto?UINavigationBar Aparece bajo StatusBar

alt text

Respuesta

32

Esto puede llegar un poco tarde pero acabo de tener el mismo problema EXACTO. Estaba diseñando una vista de lector en pantalla completa con una barra de estado transparente, una barra de navegación y una barra de herramientas que podían desvanecerse tocando en el centro de la pantalla.

La forma en que he logrado solucionarlo es realmente simple, básicamente el núcleo del problema si esto: Cuando gira la vista y el Controlador de navegación recalcula su nueva posición, cree que debería estar en la parte superior de la ventana porque la barra de estado está oculta. Cuando muestra tanto la barra de estado como la barra de navegación después de eso, se superponen.

La manera de arreglar esto es realmente fácil, simplemente mantenga un BOOL para recordar si su superposición se muestra u oculta, e implemente tanto willRotateToInterfaceOrientation como willAnimateRotationToInterfaceOrientation en su ViewController.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (!isOverlayShowing) 
    { 
     [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
    } 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (!isOverlayShowing) 
    { 
     [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    } 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 

Al mostrar y ocultar la StatusBar en estos dos métodos rápidamente, el StatusBar se muestra en el momento exacto de la navigationbar vuelve a calcular su posición. No sé si esta es la mejor implementación para solucionar este problema, pero hasta ahora este método funciona y no crea ningún parpadeo en la pantalla y es muy sencillo.

Espero que alguien más con mi problema tropiece con esta publicación y encuentre esta solución fácil a este problema.

+8

Gracias.Esto me estaba volviendo loco. – bdmontz

+3

Guau, guau. ¡Esta es la solución que he estado buscando! Mi problema era que si el usuario cerraba la aplicación, giraba el dispositivo y lo relanzaba, obtenía una barra de estado superpuesta. Ni siquiera se me ocurrió que tal vez los eventos de rotación se estaban disparando para las subvistas en el relanzamiento. ¡Esto lo resuelve! – Shizam

+1

Usted, buen señor, es un caballero, un erudito y un caballero. –

1

Por desgracia, es un poco molesto. Cuando se oculta la barra de estado, básicamente abre ese espacio para que use uiviewcontrollers. Con el ajuste automático, básicamente se moverá a ese espacio porque no tiene idea de que va a querer usar ese espacio nuevamente.

Su mejor opción es cambiar el tamaño manualmente de la vista para que cuando la barra de estado aparezca nuevamente, también deslice la vista hacia abajo para que quede correctamente ubicada debajo de la barra de estado.

3

Otra solución (más simple) es restablecer el marco de la vista de nivel superior cuando se vuelve a hacer visible la barra de estado; p.ej.

- (void)exitFullScreenMode 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; 

    // work-around for navigation bar appearing under status bar - must be called before -setNavigationBarHidden: 
    self.view.window.rootViewController.view.frame = [UIScreen mainScreen].applicationFrame; 

    [self.navigationController setNavigationBarHidden:NO animated:NO]; 
} 
0
if (self.navigationController.navigationBarHidden) 
{ 
    /******* Cancel Fullscreen ****/ 
    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) 
     [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 

    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
    [self.navigationController setToolbarHidden:NO animated:YES]; 
} 
else { 
    /******* Enable Fullscreen ****/ 
    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; 

    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    [self.navigationController setToolbarHidden:YES animated:YES]; 
} 
1

que tenían problemas para configurar el alfa = 0 para el navigationbar de ocultarlo. Así que al parecer, después de llamar a:

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; 

puede quitar el navigationbar llamando oculta y la re-insertarla en la vista, y luego poner el alfa = 0:

//hiding and showing to redraw navigationBar over the status bar 
self.navigationController.navigationBarHidden = YES; 
self.navigationController.navigationBarHidden = NO; 
self.navigationController.navigationBar.alpha = 0; 

Esto va a resolver el extra espacio que la barra de estado solía ocupar.

0

solucionado este problema:

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 

    self.navigationController.navigationBarHidden = YES; 
    self.navigationController.navigationBarHidden = NO; 
Cuestiones relacionadas