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 específicamente diseñado para resolver este problema. En el guión gráfico, moví mis vistas de 20 píxeles hacia abajo para que se vean bien en iOS 7 y, para que sea compatible con iOS 6, cambié Delta y a -20.

    introduzca la descripción de la imagen aquí

    Como mi storyboard no utiliza el layout automático, para cambiar el tamaño de la altura de las vistas correctamente en iOS 6, tuve que establecer la Delta height así como Delta Y

    Si simplemente no desea ninguna barra de estado, debe actualizar su plist con estos datos: Para hacerlo, en el plist, agregue esas 2 configuraciones:

     <key>UIStatusBarHidden</key> <true/> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> 

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

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

    Si tiene un UIViewController dentro de UINavigationController y la UINavigationController navigation es visible, puede tener el siguiente código en su viewDidLoad o tener una image de background para navigationBar.

     self.edgesForExtendedLayout = UIRectEdgeNone; 

    Si tiene navigationBar oculto, debe ajustar todos los elementos de UIView desplazando 20 puntos. No veo ninguna otra solución. Usar el layout automático te ayudará un poco.

    Aquí está el código de ejemplo 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; } 

    Solo la solución de trabajo que he hecho por mi count.

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

    1 subclass de UIViewController

    2 Subclass su window.rootViewController desde esa class.

    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 shanetworkingApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } 
     -(UIStatusBarStyle)prefernetworkingStatusBarStyle { 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 shanetworkingApplication] 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 key en plist — Ver la apariencia de la barra de estado basada en el controller: 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 ".

    • verifique la tecla " View controller based status bar appearance " y establezca su valor " NO "
    • verifique que la " Status bar is initially hidden " y configure su valor " YES "

    Si las teclas no están allí, puede agregarlo seleccionando " information property list " en la parte superior y click el ícono +

    Si desea ocultarlo por completo y simplemente evitar tratar con él, esto funciona bien.

     -(BOOL) prefersStatusBarHidden { return YES; } 

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

    Si se usa xib s, una implementación muy fácil es encapsular todas las sub-vistas dentro de una vista de contenedor con indicadores de cambio de tamaño (que ya estará usando para compatibilidad de 3.5 "y 4") para que la jerarquía de vista se vea como esta

    xib heirarchy

    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, las plumas no necesitan ser modificadas para la compatibilidad con iOS 7. Si tiene un background, puede mantenerse fuera de containerView y dejar que cubra toda la pantalla.

    Esto es todo lo que se necesita para eliminar la barra de estado. introduzca la descripción de la imagen aquí

    Para la barra de navigation:

    Escribiendo este código:

     self.navigationController.navigationBar.translucent = NO; 

    simplemente hizo el truco para mí.

    La respuesta de Vincent edgesForExtendedLayout funcionó para mí.

    Estas macros ayudan a determinar la versión de OS facilitando

     // 7.0 and above #define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrdenetworkingAscending) // 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] != NSOrdenetworkingDescending) 

    agregue estas macros al file prefix.pch de su proyecto y puede acceder a ellas 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 } 

    Publicé mi respuesta a otra publicación con la misma pregunta con esta.

    Desde 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 y set self.edgesForExtendedLayout = UIRectEdgeNone funciona para mí cuando no quiero la superposition y tengo un tableviewcontroller .

    Si quiere que "Usar Autolayout" esté habilitado 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 navigation 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 function cada vez que desee corregir la position de la barra de navigation. Llamé al reproductor de playerView:didChangeToState:

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