iOS 7 Barra de navigation que oculta el contenido

Tengo una aplicación que se desarrolló en iOS 6. Pero ahora en iOS 7 o incluso mi compilation comstackda para iOS 6, pero ejecutando en un dispositivo iOS 7 la barra de navigation superior (la nueva gigante en iOS 7), mi contenido está oculto. La barra de navigation superior lo cubre. Si lo muevo manualmente con CGRect, se ve bien en iOS 7, pero ahora iOS 6 se ve horrible (mucho espacio por encima).

La aplicación fue construida con autolayout desactivada porque la reproducción automática es una manera difícil de configurar las cosas correctamente.

Mi pregunta es: ¿hay una manera fácil de mover el contenido hacia abajo solo para iOS 7? Realmente no quiero volver a habilitar la reproducción automática y pasar un mes tratando de recuperar todos los elementos de la interfaz de usuario. La aplicación es bastante sofisticada con más de 30 pantallas y mucha animation en pantallas.

Creo que todavía hay un poco de malentendido en torno a este problema de layout incluso si iOS 7 se lanzó hace más de un año. Entonces finalmente decidí elaborar más mi respuesta.

Aquí está la cosa.

Debido a que el valor pnetworkingeterminado de automaticallyAdjustsScrollViewInsets es YES , una solución bastante sencilla podría estar agregando el siguiente código:

 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { // if iOS 7 self.edgesForExtendedLayout = UIRectEdgeNone; //layout adjustements } 

en el método -viewDidLoad .

Si desea eliminar la peculiaridad de la barra de estado (debido a la transparencia de la barra, por lo que no es extraño en absoluto) agregue self.navigationController.navigationBar.translucent = NO . El valor pnetworkingeterminado es YES . Nota : esto no tiene nada que ver con el contenido, está relacionado con el contenido debido a la translucidez, ¡pero esa es una historia completamente diferente!

Debido a que extendedLayoutIncludesOpaqueBars es NO de forma pnetworkingeterminada, self.navigationController.navigationBar.translucent = NO significa básicamente tener

 self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight| UIRectEdgeBottom; 

O, más en general, algo así (es como un pseudocódigo para dar una idea …)

 BOOL enableTopEdge = extendedLayoutIncludesOpaqueBars && !navigationBarIsTranslucent self.edgesForExtendedLayout = (enableTopEdge & UIRectEdgeTop) | UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom; 

También puede intentar configurar la navigationBar.translucent = NO , como se mencionó en esta respuesta .

Para ocultar la barra de navigation , agregue lo siguiente a su UIViewController:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Hide the top navigation bar. [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [UIImage new]; self.navigationController.navigationBar.translucent = YES; } 

Para mostrar la barra de navigation , use lo siguiente:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Show the top navigation bar. self.navigationController.navigationBar.translucent = NO; } 

A continuación se muestran los resultados en iOS7:

La barra de navegación está oculta.Se muestra la barra de navegación.

La captura de pantalla de la izquierda está oculta con la barra de navigation, mientras que la image de la derecha se muestra con la barra de navigation, los contenidos de la tabla se ocultan correctamente debajo de la barra de navigation.

¡Espero que esto ayude!

Ponga self.edgesForExtendedLayout = UIRectEdgeNone;

en su método ViewDidLoad