uinavigationbar - iOS 7 | Botones de la barra de navegación/barra de herramientas muy cerca de la barra de estado
uistoryboard uitoolbar (6)
Tengo un problema al arrastrar una barra de navegación o barra de herramientas (guión gráfico) a mi controlador de vista.
Barra de navegación de UIN:
Como puede ver en la imagen de arriba, el botón derecho casi se superpone a la barra de estado.
Con un UIToolbar pasa lo mismo:
Estos controladores de vista están diseñados para ser usados como un Modal, esa es la razón por la que no estoy usando un UINavigationController.
En otra sección utilizo un UINavigationController y aparece como espero:
¿Cómo puedo arrastrar un UINavigationBar / UIToolbar a un controlador de vista sin superponer la barra de estado?
Hacer estos pasos
Arrastre la barra de navegación a su ViewController en Xib, establezca el ViewController como su delegado. Tenga en cuenta que la barra de navegación debe estar en (0, 20)
En ViewController, cumpla con el UINavigationBarDelegate
@interface ETPViewController () <UINavigationBarDelegate>
Implementar este método.
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
positionForBar le dice a NavigationBar si debe extender su fondo hacia arriba en la barra de estado
Me di por vencido y tuve que establecer la restricción de altura de la barra de navegación en 64 en el VC basado en x xib porque viewController.topLayoutGuide.length es 0 en viewDidLoad a pesar de que la barra de estado está presente: desperdiciado en la parte superior de la vista (porque la barra de estado está separada de la ventana de simulación del iPhone)
Por favor, vea mi respuesta aquí, he copiado el contenido a continuación para mayor comodidad:
https://.com/a/18912291/1162959
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.
Puede resolver este problema usando Diseño automático, según esta nota técnica (Cómo evitar que la barra de estado cubra sus vistas).
Aquí hay algunos extractos:
Agregue la restricción de espacio vertical a la vista superior
- Control de arrastre desde la barra de herramientas a la "Guía de diseño superior"
- En la ventana emergente, seleccione "Espaciado vertical"
- Cambie la Constante de "Restricción de espacio vertical" a 0 (cero)
Si tiene otras subvistas debajo de la barra de herramientas de la UIT, fije esas vistas a la barra de herramientas en lugar de a la Guía de diseño superior
Esto apoyará ios6 y ios7.
También puede administrarlo aumentando la altura de la barra de navegación proporcionando una imagen de tamaño 620x128 para la versión ios. Y esta imagen se utiliza en:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)?YES:NO) {
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"newImage.png"] forBarMetrics:UIBarMetricsDefault];
}else{
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"previousImage.png"] forBarMetrics:UIBarMetricsDefault];
}
Las barras de navegación o las barras de herramientas deben estar en (0, viewController.topLayoutGuide.length
) con la barra de posicionamiento de UIBarPositionTopAttached
. Debe establecer el delegado de su barra de navegación o su barra de herramientas en su controlador de vista y devolver UIBarPositionTopAttached
. Si está posicionado correctamente, tendrá el resultado en su tercera imagen.
Más información aquí: https://developer.apple.com/documentation/uikit/uibarpositioningdelegate?language=objc