UINavigationBar/Barra de estado en IOS7
uinavigationcontroller uistatusbar (15)
¿Intentó la recomendación de Apple sobre "Evitar que la barra de estado cubra sus vistas": https://developer.apple.com/library/content/qa/qa1797/_index.html
¿Y echó un vistazo a "UIBarPositioningDelegate": https://developer.apple.com/documentation/uikit/uibarpositioningdelegate
EDICIÓN final
(En lugar de tener una pregunta demasiado larga con las ediciones que hacen una edición final para aclarar, consulte otras ediciones si es necesario).
Configuración del controlador
Tengo una aplicación que se configura de la siguiente manera:
InitialViewController (subclase de ECSlidingViewController )
Controlador de navegación principal (subclase de UINavigationController
)
Controlador principal de Home View (subclase de UIViewController
)
En el viewDidLoad
del initialViewController cargué el controlador de navegación principal con el Home View Controller como su raíz.
self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];
La cuestión
En la primera carga de la aplicación, la barra de estado y la barra de navegación están separadas.
Este es el efecto deseado.
Sin embargo, luego cargo un controlador de vista modal y lo cierro, usando los métodos estándar:
[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];
Luego cierra con:
[self dismissViewControllerAnimated:YES completion:nil];
Esto, a su vez, hace que el controlador de navegación principal (que contiene el controlador de la vista de inicio) muestre la barra de estado incorrectamente y se superponga:
Pruebas
- La configuración de plist se establece en SÍ -
View controller-based status bar appearance
- He intentado establecer el
edgesForExtendedLayout
en el none relevante, pero ningún cambio.
Explotación florestal
He intentado cerrar sesión algunos marcos para ver dónde ocurre el problema:
En la primera carga:
Navegador principal VC - Ver fotograma - {{0, 0}, {320, 480}}
Main Nav VC - Nav Bar Frame - {{0, 0}, {320, 44}}
Initial VC - View Frame - {{0, 0}, {320, 480}}
Home VC - View Frame - {{0, 0}, {320, 480}} -- viewDidLoad Home VC
Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC
--- After Modal is opened/closed ----
Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC
Main Nav VC - View Frame - {{0, 0}, {320, 480}} -- viewWillAppear Main Nav
Main Nav VC - Nav Bar Frame - {{0, 20}, {320, 44}} -- viewWillAppear Main Nav
Home VC - View Frame - {{0, 44}, {320, 436}} -- viewDidAppear Home VC
¿Intentaste agregar el siguiente código a tu método viewDidLoad
:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
Se explica rápidamente en la migración de Apple a iOS 7 doumentation.
En iOS 7.0, UIViewController
funciona de forma predeterminada de esta manera. La vista será a pantalla completa si está utilizando UIViewController dentro de UINavigationController
y la UINavigationController
navigationBar
está visible.
Si la barra de navegación es visible haz lo siguiente. ==>
self.edgesForExtendedLayout = UIRectEdgeNone
Si la barra de navegación está oculta, haz lo siguiente. ==>
Ajusta todos los elementos UIView
desplazando 20 puntos
Si usa Interface builder, puede usar deltas de iOS6 / 7: Primero, "ver como iOS 6.0", luego configure un delta de "20" para lograr el desplazamiento de +20 en iOS 7
Hay una forma incorporada para hacer esto. Igual que la respuesta de Joel Cave, pero elaborada:
Haz que tu barra de navegación tenga un origen Y de 20 puntos.
Luego en el archivo .h:
@interface XYZViewController : UIViewController <UIBarPositioningDelegate>
Y en el archivo .m:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationBar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
He respondido a este problema en detalle en esta respuesta a una pregunta similar . La respuesta corta es la siguiente: no hay forma de obtener el comportamiento de diseño de barra de estado automático al que está acostumbrado desde iOS 6 y versiones anteriores. Tendrá que diseñar a su alrededor, o encontrar una manera de simular el estilo antiguo (cubro ambos enfoques).
Le recomiendo encarecidamente que no realice ajustes manuales en el marco de la barra de navegación. Deje que UINavigationController lo maneje usted mismo. Lo más probable es que su problema sea que el marco de la vista de su controlador de navegación no es igual a los límites de UIScreen.
La solución a esto es en realidad muy simple. Se trata de manipular el valor center.y de center.y
, que es lo que UIKit utiliza de forma nativa para ajustar UINavigationBar a la altura de la barra de estado. En aras de la simplicidad, hice una subclase de UINavigationBar e hice lo siguiente:
@implementation MyNavigationBar
- (void) setCenter:(CGPoint)center {
// Anything less than or equal to 22 is something we don''t want (below SB height)
if(center.y > 22) [super setCenter:center];
}
@end
Llegué un poco tarde para la fiesta, pero como enfrenté el mismo problema y este fue el primer resultado que apareció en la búsqueda, creo que mi respuesta podría ayudar a otras personas :)
Arreglé el problema implementando
- (BOOL)shouldAutorotate
{
return NO;
}
En el controlador de vista que presenta el modal.
Me sorprende que nadie haya encontrado la respuesta correcta todavía. ¡UIBarPositioningDelegate funciona como un encanto! Solo haga que su controlador de vista sea UIBarPositioningDelegate y asígnele el delegado de la barra. Coloca la barra 20 píxeles desde la parte superior de tu vista. Luego agregue este método a su controlador de vista (solo disponible en iOS7 +):
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
Pruébalo, todas las barras de navegación deben ser translúcidas si está desactivado.
[self.navigationController.navigationBar setTranslucent:NO];
Si diseñó su vista con un guión gráfico, puede resolver el problema utilizando XCode. Seleccione el widget de la barra de navegación y desmarque "Translúcido".
Sé que tienes ViewController como VC principal. Pero si alguien está utilizando UITableviewController y tiene el mismo problema, este código resuelve el problema:
self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
Sí tenía el mismo problema. Siguió todo el paso pero ningún cambio.
Funcionó asegurándose de que AutoLayout se configuró correctamente para toda la pantalla, no solo la vista superior / barra de herramientas como se especifica en
"Cómo evitar que la barra de estado cubra sus vistas": https://developer.apple.com/library/ios/qa/qa1797/_index.html
Al menos para todas las Vistas justo debajo del principal Viewcontroller.view.
Solucioné un problema de este tipo usando la respuesta de este post: iOS 7 | Botones de la barra de navegación / barra de herramientas muy cerca de la barra de estado
Usando Autolayout debes ignorar la configuración de un nuevo Frame. Debe agregar una restricción de espacio superior igual a 20 para la barra superior para iOS 7.
Tuve un problema similar con un botón de menú "hamburguesa" que desliza el controlador de vista principal y tenía un controlador de vista de menú en el lateral. Encontré que la barra de navegación del controlador de vista de menú no sabía si la barra de estado se mostraba o no. Lo arreglé mediante la publicación de una notificación cuando se mostraba la barra de estado y luego se ocultaba.
[self.navigationController setNavigationBarHidden:YES/NO animated:NO];
en el controlador de vista del menú.
la mejor manera es agregando esto en la vista con la que tiene el problema:
if (self.navigationController.navigationBar.frame.origin.y==0)
self.navigationController.navigationBar.frame =
CGRectMake(self.navigationController.navigationBar.frame.origin.x,
self.navigationController.navigationBar.frame.origin.y,
self.navigationController.navigationBar.frame.size.width,
64);