ios - safe - navigation bar swift 4
cómo presentar un controlador de vista en iOS7 sin que la barra de estado se superponga (4)
Estoy viendo que cuando migro mi aplicación a iOS 7, la barra de navegación aparece debajo de la barra de estado cuando se presenta un controlador de vista. Creo que mucha gente se ha topado con este mismo problema. Aquí hay una captura de pantalla de lo que estoy viendo:
Requisitos:
La nueva vista debe aparecer "modalmente", es decir, necesito presentViewController.
Muestra algún tipo de barra de navegación o barra de herramientas, con la barra de estado tomando el color de fondo de la barra de navegación al estilo iOS 7.
Debe funcionar en iOS 6.
Estoy usando un xib para manejar el diseño, con la reproducción automática habilitada.
Opciones:
A. Cambia un poco el marco de tu vista.
Ugh, ¿volvemos a los 5 días previos a iOS y nos volvemos locos con los marcos? Además, generalmente no es una buena idea mezclar con autolayout.
B. Agrega un pequeño espacio arriba de la barra de navegación.
Una desventaja de las opciones A y B es que la barra de estado no se integrará en su navegación:
C. Añadir restricciones programáticas.
La principal desventaja es que tendrá que eliminar con restricciones y calcular las alturas de la barra de navegación y de estado. Puaj
D. Estire la altura de la barra de navegación / barra de herramientas para incluir el área de la barra de estado.
Se ve bien en iOS 7, pero se interrumpe en iOS 6. Deberá actualizar la altura de la barra de navegación de manera programática y también asegurarse de que el resto de su vista se actualice adecuadamente. Sucio.
E. Mess con los deltas de iOS6 / 7 en IB.
Múltiples desventajas: estarás codificando los deltas de ios6 / 7. Tampoco funciona con autolayout.
F. Utilice un controlador de UINavigation anidado.
Esta es la solución que he seleccionado. Ver respuesta a continuación.
Abre tu archivo xib y selecciona el controlador de vista. en la pestaña del inspector, seleccione los atributos y seleccione en la barra superior "Barra de navegación opaca". Esto resolvió mi problema.
Debe agregar una restricción vertical desde su vista superior a la Guía de diseño superior como se describe en el siguiente artículo de Apple.
https://developer.apple.com/library/ios/qa/qa1797/_index.html
El siguiente código funcionó para mí. Simplemente póngalo en el controlador que está presentando el nuevo controlador.
#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
La solución más sencilla que he encontrado es envolver el controlador de vista que desea presentar dentro de un controlador de navegación y luego presentar ese controlador de navegación.
MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];
Ventajas:
- No es necesario muckear con marcos.
- 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 navegación o barras de herramientas y agregar UIBarButtonItems a la barra de navegación mediante programación. Afortunadamente esto es bastante fácil.