ios7 uinavigationcontroller uinavigationbar uistatusbar

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

  1. La configuración de plist se establece en SÍ - View controller-based status bar appearance
  2. 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; }


Para mí la solución fue cambiar la barra de navegación a 20 puntos


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.



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);