iOS 7: la barra de estado se superpone a la vista

Tengo un ViewController que está dentro de un UINavigationcontroller , pero el navigationBar está oculto. Cuando ejecuto la aplicación en iOS 7, la barra de estado se muestra en la parte superior de mi vista. Hay alguna manera de evitar esto?

No quiero escribir ningún código específico del sistema operativo.

Ingrese la descripción de la imagen aquí

Intenté configurar la View controller-based status bar appearance en NO , pero no solucionó el problema.

Xcode 5 tiene iOS 6/7 Deltas que está específicamente diseñado para resolver este problema. En el guión gráfico, moví mis puntos de vista 20 píxeles hacia abajo para mirar hacia la derecha en iOS 7 y, para hacerlo compatible con iOS 6, cambié Delta y a -20.

enter image description here

Como mi guión gráfico no usa el diseño automático, para cambiar el tamaño de la altura de las vistas correctamente en iOS 6, tuve que configurar la Delta height así como Delta Y

Si simplemente NO quiere ninguna barra de estado, necesita actualizar su plist con estos datos: Para hacer esto, en la lista, agregue esas 2 configuraciones:

 UIStatusBarHidden  UIViewControllerBasedStatusBarAppearance  

En iOS 7, se espera que diseñe su aplicación con una barra de estado transparente superpuesta en mente. Vea la nueva aplicación iOS 7 Weather por ejemplo.

Este es el comportamiento predeterminado de UIViewController en iOS 7. La vista será en pantalla completa, lo que significa que la barra de estado cubrirá la parte superior de su vista.

Si tiene un UIViewController dentro de un UINavigationController y la UINavigationController navegación es visible, puede tener el siguiente código en su viewDidLoad o tener una imagen de fondo para la viewDidLoad de navegación hacer el truco.

 self.edgesForExtendedLayout = UIRectEdgeNone; 

Si tiene NavigationBar oculto, entonces tiene que ajustar todos los elementos de UIView cambiando 20 puntos. No veo ninguna otra solución. Usar el diseño automático ayudará un poco.

Aquí está el código de muestra para detectar la versión de iOS, si desea compatibilidad con versiones anteriores.

 NSUInteger DeviceSystemMajorVersion() { static NSUInteger _deviceSystemMajorVersion = -1; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSString *systemVersion = [UIDevice currentDevice].systemVersion; _deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue]; }); return _deviceSystemMajorVersion; } 

La única solución de trabajo que he creado yo mismo.

Aquí está mi subclase UIViewController https://github.com/comonitos/ios7_overlaping

1 Subclase de UIViewController

2 Subclase su window.rootViewController de esa clase.

3 Voila!

 - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { CGRect screen = [[UIScreen mainScreen] bounds]; if (self.navigationController) { CGRect frame = self.navigationController.view.frame; frame.origin.y = 20; frame.size.height = screen.size.height - 20; self.navigationController.view.frame = frame; } else { if ([self respondsToSelector: @selector(containerView)]) { UIView *containerView = (UIView *)[self performSelector: @selector(containerView)]; CGRect frame = containerView.frame; frame.origin.y = 20; frame.size.height = screen.size.height - 20; containerView.frame = frame; } else { CGRect frame = self.view.frame; frame.origin.y = 20; frame.size.height = screen.size.height - 20; self.view.frame = frame; } } } } 

4 Agregue esto para hacer que su barra de estado sea blanca Justo después de [self.window makeKeyAndVisible]; !!!

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } 
 -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } -(void)viewWillLayoutSubviews{ if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { self.view.clipsToBounds = YES; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenHeight = 0.0; if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) screenHeight = screenRect.size.height; else screenHeight = screenRect.size.width; CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20); CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil]; if (!CGRectEqualToRect(screenFrame, viewFrame1)) { self.view.frame = screenFrame; self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); } } } 

Agregar clave en plist — Ver apariencia de barra de estado basada en controlador: NO

Para ocultar la barra de estado en ios7, siga estos sencillos pasos:

En Xcode vaya a la carpeta ” Resources ” y abra ” (app name)-Info.plist file “.

  • verifica la clave ” View controller based status bar appearance ” y establece su valor ” NO
  • verifique que la clave ” Status bar is initially hidden ” y establezca su valor ” YES

Si las claves no están allí, puede agregarlas seleccionando ” information property list ” en la parte superior y haciendo clic en el ícono +

Si quieres ocultarlo por completo y simplemente evitar lidiar con él, esto funciona bien.

 -(BOOL) prefersStatusBarHidden { return YES; } 

referencia https://stackoverflow.com/a/18873777/1030449

Si usa xib s, una implementación muy sencilla es encapsular todas las subvistas dentro de una vista de contenedor con indicadores de cambio de tamaño (que ya usará para compatibilidad de 3.5 “y 4”) para que la jerarquía de vista se vea algo como esto

Jerarquía xib

y luego en viewDidLoad , haz algo como esto:

 - (void)viewDidLoad { [super viewDidLoad]; // initializations if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above { CGRect frame = containerView.frame; frame.origin.y += 20; frame.size.height -= 20; containerView.frame = frame; } } 

De esta forma, los plumines no necesitan ser modificados para la compatibilidad con iOS 7. Si tiene un fondo, puede mantenerse fuera de containerView y dejarlo cubrir toda la pantalla.

Esto es todo lo que se necesita para eliminar la barra de estado. enter image description here

Para la barra de navegación:

Escribiendo este código:

 self.navigationController.navigationBar.translucent = NO; 

acabo de hacer el truco para mí.

Los bordes de respuesta de Vincent para Forzar Extendido funcionaron para mí.

Estas macros ayudan a determinar la versión del sistema operativo por lo que es más fácil

 // 7.0 and above #define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) // 6.0, 6.0.x, 6.1, 6.1.x #define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending) 

agregue estas macros al archivo prefix.pch de su proyecto y se puede acceder desde cualquier lugar

 if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE()) { //some iOS 7 stuff self.edgesForExtendedLayout = UIRectEdgeNone; } if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW()) { // some old iOS stuff } 

He publicado mi respuesta a otra publicación con la misma pregunta con esta.

De la Guía de transición de Apple iOS7, https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

Específicamente, automaticallyAdjustsScrollViewInsets=YES set self.edgesForExtendedLayout = UIRectEdgeNone automaticallyAdjustsScrollViewInsets=YES y set self.edgesForExtendedLayout = UIRectEdgeNone funciona para mí cuando no quiero la superposición y tengo un tableviewcontroller .

Si desea que se habilite “Usar ajuste automático” a cualquier costo, coloque el siguiente código en viewdidload.

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { self.edgesForExtendedLayout = UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars = NO; self.automaticallyAdjustsScrollViewInsets = NO; } 

Mi barra de estado y la barra de navegación se superponen después de regresar de la vista horizontal de YTPlayer. Aquí está mi solución después de probar la versión de @comonitos pero no funciona en mi iOS 8

 - (void)fixNavigationBarPosition { if (self.navigationController) { CGRect frame = self.navigationController.navigationBar.frame; if (frame.origin.y != 20.f) { frame.origin.y = 20.f; self.navigationController.navigationBar.frame = frame; } } } 

Simplemente llame a esta función cada vez que quiera arreglar la posición de la barra de navegación. Llamé a playerView de playerView:didChangeToState:

 - (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state { switch (state) { case kYTPlayerStatePaused: case kYTPlayerStateEnded: [self fixNavigationBarPosition]; break; default: } }