¿La barra de estado de iOS 7 regresa al estilo predeterminado de iOS 6 en la aplicación iPhone?

En iOS 7, UIStatusBar se ha diseñado de forma que se combina con la vista de esta manera:

GUI diseñado por Tina Tavčar (GUI diseñado por Tina Tavčar )

  • Es genial, pero de alguna manera daña tu vista cuando tienes algo en la parte superior de tu vista, y se superpone con la barra de estado.

  • ¿Existe una solución simple (como establecer una propiedad en info.plist) que pueda cambiar la forma en que funciona [no se superpone] a cómo está en iOS6?

  • Sé que una solución más directa es tener self.view.center.x + 20 puntos para cada controlador de vista individual, pero cambiarlos atornillará otras dimensiones (tener un self.view.center.x diferente puede causar problemas a los segues personalizados , etc.) y de repente se convierte en un trabajo tedioso que es mejor evitar.

  • Realmente me alegrará si alguien puede proporcionarme una solución de una sola línea para esto.

PD Sé que puedo ocultar la barra de estado haciendo cosas como tener

 [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 

En el método didFinishLaunchingWithOptions , pero eso es una solución alternativa, un atajo que evita el problema, por lo que no considero que sea una solución real.

Esto se publica de forma cruzada a partir de una publicación de blog que escribí , pero aquí está el resumen completo de barras de estado, barras de navegación y controladores de vista de contenedor en iOS 7:

  1. No hay forma de preservar el diseño de la barra de estado del estilo iOS 6. La barra de estado siempre superpondrá su aplicación en iOS 7

  2. No confunda la apariencia de la barra de estado con el diseño de la barra de estado. La apariencia (clara o predeterminada) no afecta la forma en que se establece la barra de estado (marco / altura / superposición). Es importante tener en cuenta también que la barra de estado del sistema ya no tiene ningún color de fondo. Cuando la API se refiere a UIStatusBarStyleLightContent, significa texto blanco sobre un fondo claro. UIStatusBarStyleDefault es texto negro sobre fondo claro.

  3. La apariencia de la barra de estado se controla a lo largo de una de las dos rutas de base mutuamente excluyentes: puede establecerlas programáticamente de la manera tradicional o UIKit actualizará la apariencia en función de algunas propiedades nuevas de UIViewController. La última opción está activada por defecto. Compruebe el valor de plist de su aplicación para “Apariencia de la barra de estado basada en ViewController” para ver cuál está utilizando. Si establece este valor en SÍ, cada controlador de vista de nivel superior en su aplicación (que no sea un controlador de vista de contenedor UIKit estándar) debe anular preferredStatusBarStyle, devolviendo el estilo predeterminado o el estilo claro. Si edita el valor plist a NO, puede administrar la apariencia de la barra de estado utilizando los métodos de aplicación UIA familiares.

  4. UINavigationController alterará la altura de su UINavigationBar a 44 puntos o 64 puntos, dependiendo de un conjunto de restricciones bastante extraño e indocumentado. Si el UINavigationController detecta que la parte superior del marco de su vista es visualmente contigua a la parte superior de su UIWindow, dibuja su barra de navegación con una altura de 64 puntos. Si la parte superior de su vista no es contigua a la parte superior de UIWindow (incluso si está desactivada en un solo punto), dibuja su barra de navegación de la manera “tradicional” con una altura de 44 puntos. Esta lógica la realiza UINavigationController incluso si se trata de varios elementos secundarios dentro de la jerarquía del controlador de vista de su aplicación. No hay forma de prevenir este comportamiento.

  5. Si proporciona una imagen de fondo de barra de navegación personalizada que tiene solo 44 puntos (88 píxeles) de altura, y los límites de la vista de UINavigationController coinciden con los límites de la ventana de UI (como se explica en el n. ° 4), UINavigationController dibujará su imagen en el marco (0,20,320 , 44), dejando 20 puntos de espacio negro opaco encima de su imagen personalizada. Esto puede confundirte al pensar que eres un desarrollador inteligente que pasó por alto la regla n. ° 1, pero te equivocas. La barra de navegación aún tiene 64 puntos de alto. Incrustar un UINavigationController en una jerarquía de vista de estilo de deslizamiento a revelador lo deja muy claro.

  6. Tenga cuidado con la propiedad llamada bordesForExtendedLayout de UIViewController. El ajuste de bordes para ExtendedLayout no hace nada en la mayoría de los casos. La única forma en que UIKit usa esta propiedad es si agrega un controlador de vista a un UINavigationController, entonces el UINavigationController usa edgesForExtendedLayout para determinar si su controlador de vista hijo debe o no ser visible debajo de la barra de navegación / barra de estado. Establecer edgesForExtendedLayout en el UINavigationController no modifica en nada si el UINavigationController tiene un área de barra de navegación alta de 44 o 64 puntos. Ver # 4 para esa lógica. La lógica de disposición similar se aplica a la parte inferior de su vista cuando se utiliza una barra de herramientas o UITabBarController.

  7. Si todo lo que intenta hacer es evitar que su controlador personalizado de vista secundaria sobresalga de la barra de navegación cuando está dentro de un UINavigationController, entonces establezca edgesForExtendedLayout en UIRectEdgeNone (o al menos una máscara que excluya UIRectEdgeTop). Establezca este valor lo más temprano posible en el ciclo de vida de su controlador de visualización.

  8. UINavigationController y UITabBarController también tratarán de rellenar el contenidoInset de vistas de tabla y vistas de colección en su jerarquía de subvista. Lo hace de una manera similar a la lógica de la barra de estado desde el # 4. Hay una forma programática de evitar esto, estableciendo automáticamente AdjustsScrollViewInsets en NO para sus vistas de tabla y vistas de colección (su valor predeterminado es SÍ). Esto planteó algunos problemas graves para Whisper and Riposte, ya que utilizamos los ajustes de contentInset para controlar el diseño de las vistas de tabla en respuesta a la barra de herramientas y los movimientos del teclado.

  9. Para reiterar: no hay forma de volver a la lógica de diseño de la barra de estado del estilo iOS 6. Para aproximar esto, debe mover todos los controladores de vista de su aplicación a una vista de contenedor que se compensa con 20 puntos desde la parte superior de la pantalla, dejando una vista intencionalmente negra detrás de la barra de estado para simular la apariencia anterior. Este es el método que terminamos usando en Riposte and Whisper.

  10. Apple está presionando mucho para asegurarse de que no intente hacer el n. ° 9. Quieren que rediseñamos todas nuestras aplicaciones para colocar debajo de la barra de estado. Sin embargo, existen muchos argumentos convincentes, tanto para la experiencia del usuario como por razones técnicas, por qué esto no siempre es una buena idea. Debe hacer lo que sea mejor para sus usuarios y no simplemente seguir la fantasía de la plataforma.

Actualizaciones el 19 de septiembre de 2013:

errores de escala fijos añadiendo self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

errores ortográficos corregidos en la statement NSNotificationCenter

Actualizaciones el 12 de septiembre de 2013:

corregido UIViewControllerBasedStatusBarAppearance a NO

agregó una solución para aplicaciones con rotación de pantalla

se agregó un enfoque para cambiar el color de fondo de la barra de estado.

Aparentemente, no hay forma de revertir la barra de estado de iOS7 a cómo funciona en iOS6.

Sin embargo, siempre podemos escribir algunos códigos y convertir la barra de estado en similar a iOS6, y esta es la forma más corta en que se me ocurre:

  1. Establezca UIViewControllerBasedStatusBarAppearance en NO en info.plist (para info.plist que los controladores de vista ajusten el estilo de la barra de estado para que podamos establecer el estilo de la barra de estado mediante el método UIApplicationstatusBarStyle).

  2. En la application:didFinishLaunchingWithOptions de AppDelegate application:didFinishLaunchingWithOptions , llamada

     if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.clipsToBounds =YES; self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); //Added on 19th Sep 2013 self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height); } return YES; 

a fin de que:

  1. Verifica si es iOS 7.

  2. Establezca que el contenido de la barra de estado sea blanco, a diferencia de UIStatusBarStyleDefault.

  3. Evite que se muestren las subvistas cuyas ttwigs se extienden más allá de los límites visibles (para las vistas animadas en la vista principal desde arriba).

  4. Cree la ilusión de que la barra de estado ocupa espacio, como en iOS 6, al cambiar y cambiar el tamaño del marco de la ventana de la aplicación.

Para aplicaciones con rotación de pantalla,

use NSNotificationCenter para detectar cambios de orientación al agregar

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 

en if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) y cree un nuevo método en AppDelegate:

 - (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification { int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue]; int w = [[UIScreen mainScreen] bounds].size.width; int h = [[UIScreen mainScreen] bounds].size.height; switch(a){ case 4: self.window.frame = CGRectMake(0,20,w,h); break; case 3: self.window.frame = CGRectMake(-20,0,w-20,h+20); break; case 2: self.window.frame = CGRectMake(0,-20,w,h); break; case 1: self.window.frame = CGRectMake(20,0,w-20,h+20); } } 

De modo que cuando la orientación cambie, activará una statement de cambio para detectar la orientación de la pantalla de la aplicación (vertical, vertical, horizontal izquierda o horizontal derecha) y cambiará el marco de la ventana de la aplicación respectivamente para crear la ilusión de la barra de estado de iOS 6.

Para cambiar el color de fondo de su barra de estado:

Añadir

  @property (retain, nonatomic) UIWindow *background; 

en AppDelegate.h para hacer del background una propiedad de su clase y evitar que ARC lo desasigne. (No tiene que hacerlo si no está usando ARC).

Después de eso, solo necesita crear la ventana UI en if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) :

 background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)]; background.backgroundColor =[UIColor redColor]; [background setHidden:NO]; 

No te olvides de @synthesize background; después de @implementation AppDelegate !

ACTUALIZACIÓN (NUEVA SOLUCIÓN)

Esta actualización es la mejor solución del problema de la barra de navegación iOS 7. Puede establecer el ejemplo de color de la barra de navegación: FakeNavBar.backgroundColor = [UIColor redColor];

Nota: si usa el controlador de navegación predeterminado, utilice la solución anterior.

AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) { UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)]; FakeNavBar.backgroundColor = [UIColor whiteColor]; float navBarHeight = 20.0; for (UIView *subView in self.window.subviews) { if ([subView isKindOfClass:[UIScrollView class]]) { subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight); } else { subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height); } } [self.window addSubview:FakeNavBar]; } return YES; } 

SOLUCIÓN ANTIGUA – SI usa el código anterior, ignore el siguiente código e imagen

Esta es la versión anterior de la solución de barra de navegación iOS 7.

Resolví el problema con el siguiente código. Esto es para agregar una barra de estado. didFinishLaunchingWithOptions

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 320, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar [self.window.rootViewController.view addSubview:addStatusBar]; } 

Y para Interface Builder esto es para cuando abres con iOS 6; está comenzando en 0 píxeles.

Nota: iOS 6/7 Los deltas solo aparecen si desmarca la opción “Usar el ajuste automático” para View Controller en “File Inspector” (icono de la izquierda) en el panel de detalles.

Ingrese la descripción de la imagen aquí

SOLUCIÓN:

Establézcalo en su controlador de visualización o en rootviewcontroller anulando el método:

 -(BOOL) prefersStatusBarHidden { return YES; } 

Aquí otro enfoque para los proyectos que hacen un uso extensivo del Storyboard:

GOL:

El objective de este enfoque es recrear el mismo estilo de barra de estado en iOS7 que en iOS6 (consulte el título de la pregunta “Barra de estado de iOS 7 Volver al estilo iOS 6”).

RESUMEN:

Para lograr esto, usamos Storyboard tanto como sea posible cambiando los elementos de la IU que se superponen con la barra de estado (bajo iOS 7) hacia abajo, mientras usamos deltas para revertir el cambio de diseño hacia abajo para iOS 6.1 o anterior. El espacio extra resultante en iOS 7 está ocupado por una UIView con el backgroundColor configurado a un color de nuestra elección. Este último se puede crear en código o usando Storyboard (ver ALTERNATIVAS más abajo)

SUPOSICIONES:

Para obtener el resultado deseado al seguir los pasos a continuación, se supone que la View controller-based status bar appearance está establecida en NO y que el Status bar style está configurado en “Estilo negro transparente (alfa de 0.5)” o “Negro opaco”. estilo”. Ambas configuraciones se pueden encontrar o agregar en “Información” en la configuración de su proyecto.

PASOS:

  • Agregue una subvista a la ventana UI para que sirva como fondo de la barra de estado. Para lograr esto, agregue lo siguiente a su application: didFinishLaunchingWithOptions: de AppDelegate application: didFinishLaunchingWithOptions: después de makeKeyAndVisible

     if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)]; statusBarBackgroundView.backgroundColor = [UIColor blackColor]; [yourAppsUIWindow addSubview:statusBarBackgroundView]; } 
  • Debido a que programáticamente agregó un fondo para iOS 7 SOLAMENTE, tendrá que ajustar el diseño de los elementos de la IU que están superpuestos por la barra de estado en consecuencia mientras preserva su diseño para iOS6. Para lograr esto, haga lo siguiente:

    • Asegúrese de que Use Autolayout esté desactivado para su Storyboard (esto se debe a que de lo contrario “iOS 6/7 Deltas” no se muestra en Size Inspector). Para hacer esto:
      • selecciona tu archivo Storyboard
      • mostrar Utilidades
      • selecciona “Mostrar el Inspector de archivos”
      • Debajo de “Documento de Interface Builder” desmarque “Usar Autolayout”
    • Opcionalmente, para ayudarlo a supervisar los cambios de diseño para iOS 7 y 6 a medida que los aplica, seleccione “Editor Asistente”, seleccione “Vista previa” y “iOS 6.1 o anterior”: enter image description hereenter image description here
    • Ahora seleccione el elemento UI que desea ajustar para que no quede superpuesto por la barra de estado.
    • Seleccione “Mostrar el Inspector de Tamaño” en la columna de Utilidades
    • Vuelva a colocar su elemento UI a lo largo del eje Y en la misma cantidad que la barra de estado bg height: enter image description here
    • Y cambie el valor de iOS6 / 7 Deltas para Y por la misma cantidad NEGATIVA que la barra de estado bg height (tenga en cuenta el cambio en la vista previa de iOS 6 si lo está usando): enter image description here

ALTERNATIVAS:

Para agregar aún menos código en proyectos pesados ​​y tener la autorotación de fondo de la barra de estado, en lugar de agregar programáticamente un fondo para su barra de estado, puede agregar una vista coloreada a cada controlador de vista que se encuentra en la parte superior de la vista principal de dicho controlador. Luego, cambiaría el delta de altura de esta nueva vista a la misma cantidad negativa que la altura de su vista (para hacer que desaparezca en iOS 6).

La desventaja de esta alternativa (aunque tal vez insignificante teniendo en cuenta la compatibilidad con autorrotatorio) es el hecho de que esta vista adicional no es visible inmediatamente si está viendo su Storyboard para iOS 6. Solo sabría que está ahí si echó un vistazo al ” Document Outline “del Storyboard.

Si no desea que sus controles de vista se superpongan con la barra de estado (y las barras de navegación), desmarque la casilla “Extender bordes en las barras superiores” en el Creador de interfaces en Xcode 5.

Desmarque Extender bordes debajo de las barras superiores

Apple lanzó Q & A técnica Q & A: QA1797: Impedir que la barra de estado cubra sus vistas . Funciona bien para las versiones iOS 6 e iOS 7.

He visto muchos muchos muchos muchos y muchos tutoriales para solucionar este maldito problema. ¡Pero ninguno de ellos funciona! Aquí está mi solución, y funciona para mí:

 if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) { float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; for( UIView *v in [self.view subviews] ) { CGRect rect = v.frame; rect.origin.y += statusBarHeight; v.frame = rect; } } 

La lógica es simple. Cambio las vistas de todos los niños en la vista propia con 20 píxeles. Eso es todo. Luego, la captura de pantalla se mostrará como lo hizo iOS 6. ¡Odio la barra de estado iOS7! ~ “~

Una pequeña alternativa a la respuesta de Archy Holt, un poco más simple:

a. Establezca UIViewControllerBasedStatusBarAppearance en NO en info.plist

segundo. En la application:didFinishLaunchingWithOptions: AppDelegate application:didFinishLaunchingWithOptions: llama:

 if ([[UIDevice currentDevice].systemVersion floatValue] < 7) { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; } else { // handling statusBar (iOS7) application.statusBarStyle = UIStatusBarStyleLightContent; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; self.window.clipsToBounds = YES; // handling screen rotations for statusBar (iOS7) [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; } 

Y agrega el método:

 - (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification { // handling statusBar (iOS7) self.window.frame = [UIScreen mainScreen].applicationFrame; } 

También puede considerar subclasificar UIWindow para manejar UIApplicationDidChangeStatusBarOrientationNotification .

Lo usé en todos mis controladores de vista, es simple. Agregue estas líneas en todos sus métodos viewDidLoad:

 - (void)viewDidLoad{ //add this 2 lines: if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; [super viewDidLoad]; } 

Prueba este método simple …

Paso 1 : Para cambiar en viewController

 [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque]; 

Paso 2 : cambiar en toda la aplicación

 info.plist ----> Status Bar Style --->UIStatusBarStyle to UIStatusBarStyleBlackOpaque 

Paso 3 : también agregue esto en cada viewWillAppear para ajustar la altura de la statusbar para iOS7

  [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) { CGRect frame = [UIScreen mainScreen].bounds; frame.origin.y+=20.0; frame.size.height-= 20.0; self.view.frame = frame; [self.view layoutIfNeeded]; } 

Existe una opción en Interface Builder que llama a la propiedad iOS 6/7 Delta que tiene como objective resolver el problema de compensación.

Échale un vistazo en Stack Overflow pregunta Interface Builder: ¿Para qué sirve UIView’s Layout iOS 6/7 Deltas? .

Logré una barra de estado como iOS 6 en iOS 7.

Establezca UIViewControllerBasedStatusBarAppearance en NO en info.plist

Pase este código en - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions método - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.clipsToBounds =YES; self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height); //Added on 19th Sep 2013 NSLog(@"%f",self.window.frame.size.height); self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height); } 

Puede empujar hacia abajo todas tus vistas en 20 píxeles. Para superar ese uso, utiliza el siguiente código en -(void)viewDidAppear:(BOOL)animated método -(void)viewDidAppear:(BOOL)animated

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect frame=self.view.frame; if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"]) { frame.size.height-=20; } self.view.frame=frame; } 

Debe establecer el valor de los valores de usuario de WindowHeight después de la asignación de ventana en el método didFinishLauncing como

 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"]; 

Si está utilizando el constructor de Interfaces, intente esto:

En tu archivo xib:

1) Seleccione la vista principal, establezca el color de fondo en negro (o en el color que desee que sea la barra de estado)

2) Asegúrese de que el fondo sea una subvista independiente ubicada como un niño de nivel superior de la vista del controlador.
Mueva su fondo para convertirse en un hijo directo de la vista del controlador. Compruebe el panel de autosizing para asegurarse de haber bloqueado todos los bordes del marco, activado ambos ejes de flexibilidad, y si se trata de un UIImageView, configure el modo de contenido en Escalar para completar. Programmáticamente esto se traduce en contentMode establecido en UIViewContentModeScaleToFill y tiene su máscara de cambio de tamaño automático establecida en (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).

3) Ahora mueva todo lo que está bloqueado a la parte superior, baje 20 ptos y configure un iOS 6/7 delta Y a -20.
Todos los niños de nivel superior que están bloqueados en el marco superior en el panel de autosizing deben moverse hacia abajo en 20 puntos y tienen su iOS 6/7 delta Y configurado en -20. (Cmd seleccione todos esos, y haga clic en la flecha hacia abajo 20 veces, ¿hay alguna forma mejor para alguien?)

4) Ajuste la altura delta iOS 6/7 de todos los elementos anteriores que tenían una altura flexible. Cualquiera de los elementos que se bloquearon en el marco superior e inferior y que tenían la altura flexible habilitada en el panel de autosizing también debe tener su altura delta iOS 6/7 establecida en 20. Eso incluye la vista de fondo mencionada anteriormente. Esto puede parecer anti-intuitivo, pero debido al orden en el que se aplican, es necesario. La altura del cuadro se establece primero (en función del dispositivo), luego se aplican los deltas y, finalmente, las máscaras de autosizing se aplican en función de las posiciones de desplazamiento de todos los cuadros secundarios; piénselo un poco, tendrá sentido.

5) Finalmente, los elementos que estaban bloqueados en el marco inferior pero no en el marco superior no necesitan ningún delta.

Eso le dará la barra de estado idéntica en iOS7 e iOS6.

Por otro lado, si desea estilo iOS7 mientras mantiene la compatibilidad con iOS6, establezca los valores de altura delta Y / delta en 0 para la vista de fondo.

Para ver más información de migración de iOS7, lea la publicación completa: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html

Mi solución fue agregar un UIView con una altura de 20 puntos en la parte superior de la ventana cuando estaba en iOS 7. Luego creé un método en mi clase AppDelegate para mostrar / ocultar el fondo de la barra de estado “sólido”. En application:didFinishLaunchingWithOptions: :

 // ... // Add a status bar background self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)]; self.statusBarBackground.backgroundColor = [UIColor blackColor]; self.statusBarBackground.alpha = 0.0; self.statusBarBackground.userInteractionEnabled = NO; self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views [self.window addSubview:self.statusBarBackground]; // ... return YES; 

Then I created a method to fade in/out the black status bar background:

 - (void) showSolidStatusBar:(BOOL) solidStatusBar { [UIView animateWithDuration:0.3f animations:^{ if(solidStatusBar) { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; self.statusBarBackground.alpha = 1.0f; } else { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; self.statusBarBackground.alpha = 0.0f; } }]; } 

All I have to do now is call is [appDelegate showSolidStatusBar:YES] when needed.

This may be a overwhelming problem if you use Auto layout because you can not directly manipulate frames anymore. There is a simple solution without too much work.

I ended up writing an utility method in an Utility Class and called it from all the view controllers’s viewDidLayoutSubviews Method.

 + (void)addStatusBarIfiOS7:(UIViewController *)vc { if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { CGRect viewFrame = vc.view.frame; if(viewFrame.origin.y == 20) { //If the view's y origin is already 20 then don't move it down. return; } viewFrame.origin.y+=20.0; viewFrame.size.height-= 20.0; vc.view.frame = viewFrame; [vc.view layoutIfNeeded]; } } 

Override your viewDidLayoutSubviews method in the view controller, where you want status bar. It will get you through the burden of Autolayout.

 - (void)viewDidLayoutSubviews { [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; [super viewDidLayoutSubviews]; [MyUtilityClass addStatusBarIfiOS7:self]; } 

The easiest way to do so is installing an older SDK to your newest Xcode.

How to install older SDK to the newest Xcode?

  1. U can get the iOS 6.1 SDK from http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html or downloading an older Xcode and geting the SDK from its contents

  2. Unzip and paste this folder to /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs

  3. Reinicia el xcode.

  4. U can now select an older SDK on your project’s build settings

Espero que te ayude It worked for me =)

As using presentViewController:animated:completion: messed-up the window.rootViewController.view , I had to find a different approach to this issue. I finally got it to work with modals and rotations by subclassing the UIView of my rootViewController.

.h

 @interface RootView : UIView @end 

.metro

 @implementation RootView -(void)setFrame:(CGRect)frame { if (self.superview && self.superview != self.window) { frame = self.superview.bounds; frame.origin.y += 20.f; frame.size.height -= 20.f; } else { frame = [UIScreen mainScreen].applicationFrame; } [super setFrame:frame]; } - (void)layoutSubviews { self.frame = self.frame; [super layoutSubviews]; } @end 

You now have a strong workaround for iOS7 animations.

I am late for this Answer, but i just want to share what i did, which is basically the easiest solution

First of all-> Go to your info.plist File and add Status Bar Style->Transparent Black Style(Alpha of 0.5)

Now ,here it Goes:-

Add this code in your AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Whatever your code goes here if(kDeviceiPad){ //adding status bar for IOS7 ipad if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 1024, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar [self.window.rootViewController.view addSubview:addStatusBar]; } } else{ //adding status bar for IOS7 iphone if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 320, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern [self.window.rootViewController.view addSubview:addStatusBar]; } return YES; } 

My very simple solution (assuming you have only vertical orientation supported) is to redefine application window bounds for iOS versions below 7, in App delegate didFinishLaunchingWithOptions method:

 CGRect screenBounds = [[UIScreen mainScreen] bounds]; if ([HMService getIOSVersion] < 7) { // handling statusBar (iOS6) by leaving top 20px for statusbar. screenBounds.origin.y = 20; self.window = [[UIWindow alloc] initWithFrame:screenBounds]; } else { self.window = [[UIWindow alloc] initWithFrame:screenBounds]; } 

You can hide the status bar all together. So your app will be full-screen. I think that’s the best you will get.

UIStatusBarStyleNone or set in the target settings.

Steps For Hide the status bar in iOS 7:

1.Go to your application info.plist file.

2.And Set, View controller-based status bar appearance : Boolean NO

Hope i solved the status bar issue…..

In order to continue working with setStatusBarHidden: I use this category:

 @interface UIApplication (StatusBar) -(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden; @end @implementation UIApplication (StatusBar) -(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{ if (!IOS7) { [self setStatusBarHidden:statusBarHidden]; return; } if ([self isStatusBarHidden] == statusBarHidden) { return; } [self setStatusBarHidden:statusBarHidden]; [self keyWindow].clipsToBounds = YES; CGFloat offset = statusBarHidden ? 0 : 20; [self keyWindow].frame = CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset); [self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height); } @end 

I found here is the best alternatives and solution for this navigation bar issue in iOS7!!

http://www.appcoda.com/customize-navigation-status-bar-ios-7/

I hope it will clear our all queries and worries.

This might be too late to share, but I have something to contribute which might help someone, I was trying to sub-class the UINavigationBar and wanted to make it look like ios 6 with black status bar and status bar text in white.

Here is what I found working for that

  self.navigationController?.navigationBar.clipsToBounds = true self.navigationController?.navigationBar.translucent = false self.navigationController?.navigationBar.barStyle = .Black self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor() 

It made my status bar background black, status bar text white and navigation bar’s color white.

iOS 9.3, XCode 7.3.1