Cómo presentar un controller de vista en iOS7 sin la superposition de la barra de estado.

Estoy viendo cuando migré mi aplicación a iOS 7, la barra de navigation aparece debajo de la barra de estado al presentar un controller de vista. Creo que mucha gente se ha topado con este mismo problema. Aquí hay una captura de pantalla de lo que estoy viendo:

nav existente

Requisitos:

  • La nueva vista debe aparecer "modally", es decir, necesito presentViewController.

  • Muestra algún tipo de barra de navigation o barra de herramientas, con la barra de estado tomando el color de background del estilo de la barra de navigation ala iOS 7.

  • Debe funcionar en iOS 6.

  • Estoy usando un xib para manejar el layout, con la reproducción automática habilitada.

Opciones:

A. Cambie un poco el marco de su vista.

Ugh, ¿estamos de return a los 5 días previos a iOS y nos estamos arreglando con los frameworks? Además, generalmente no es una buena idea mezclar con autolayout.

B. Agrega un pequeño espacio arriba arriba debajo de tu barra de navigation.

Una desventaja de las opciones A y B es que la barra de estado no se mezclará en su nav:

nav con espacio

C. Agregue restricciones de forma progtwigda.

La principal desventaja es que tendrás que lidiar con las restricciones y calcular las alturas de la barra de estado y de navigation. Por que

D. Estira la barra de navigation / altura de la barra de herramientas para include el área de la barra de estado.

Se ve bien en iOS 7, pero se rompe en iOS 6. Tendrá que actualizar de forma progtwigda la altura de la barra de navigation y también asegurarse de que el rest de sus vistas se actualicen correctamente. Sucio.

introduzca la descripción de la imagen aquí

E. Mess con iOS6 / 7 deltas en IB.

Múltiples desventajas: Estará codificando los deltas ios6 / 7. También no funciona con autolayout.

F. Utilice un controller de UINavigation nested.

Esta es la solución que seleccioné. Vea la respuesta a continuación.

uinavcontroller workaround

La solución más fácil que he encontrado es envolver el controller de vista que desea presentar dentro de un controller de navigation y luego presentar ese controller de navigation.

MyViewController *vc = [MyViewController new]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc]; [self presentViewController:nav animated:YES completion:NULL]; 

Ventajas:

  • No se necesitan mordedores con los frameworks.
  • El mismo código funciona en iOS 6 y iOS 7.
  • Menos feo que las otras soluciones.

Desventajas:

  • Probablemente querrá dejar su XIB vacío de barras de navigation o barras de herramientas y agregar UIBarButtonItems de forma progtwigda a la barra de navigation. Afortunadamente esto es bastante fácil.

Debe agregar una restricción vertical desde la vista superior hasta la guía de layout superior como se describe en el siguiente artículo de Apple.

https://developer.apple.com/library/ios/qa/qa1797/_index.html

introduzca la descripción de la imagen aquí

El siguiente código funcionó para mí. Simplemente colóquelo en el controller que presenta el nuevo controller.

 #pragma mark hidden status bar - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication shanetworkingApplication] setStatusBarHidden:YES]; } 

Abre tu file xib y selecciona el controller de vista. en la pestaña inspector, select los attributes y select en TopBar "Barra de navigation opaca". Esto resolvió mi problema.