Barra de estado de iOS 7 volver al estilo predeterminado de iOS 6 en la aplicación iPhone?


En iOS 7 el UIStatusBar ha sido diseñado de una manera que se fusiona con la vista de esta manera:

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

  • Es genial, pero estropeará un poco tu vista cuando tengas algo en la parte superior de tu vista, y se superpondrá con la barra de estado.

  • ¿Hay una solución simple (como configurar una propiedad en info.plist) que puede cambiar la forma en que funciona [no se superpone] de nuevo a cómo es en iOS6?

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

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

P. S. sé que puedo ocultar la barra de estado haciendo cosas como teniendo

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

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

Author: svmrajesh, 2013-08-18

25 answers

Esto es una publicación cruzada de una entrada de blog que escribí , pero aquí está el resumen completo de las barras de estado, las barras de navegación y los controladores de vista de contenedores en iOS 7:

  1. No hay forma de preservar el diseño de la barra de estado de estilo iOS 6. La barra de estado siempre se superpondrá a 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. El aspecto (claro o predeterminado) no afecta a cómo se presenta 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 un fondo claro.

  3. La apariencia de la barra de estado se controla a lo largo de una de dos rutas de base mutuamente exclusivas: puede configurarlas programáticamente de la manera tradicional, o UIKit actualizará la apariencia por usted en función de algunas propiedades nuevas de UIViewController. Esta última opción está activada de forma predeterminada. Compruebe el valor plist de su aplicación para "Apariencia de 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 ligero. Si edita el valor de plist a NO, puede administrar la apariencia de la barra de estado utilizando el UIApplication métodos.

  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 controlador UINavigationController detecta que la parte superior del marco de su vista es visualmente contigua con la parte superior de su ventana UIW, entonces 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 la ventana U (incluso si está fuera por solo un punto), entonces dibuja su barra de navegación en la forma "tradicional" con una altura de 44 puntos. Esta lógica es realizada por UINavigationController incluso si hay varios hijos dentro de la jerarquía del controlador de vista de su aplicación. No hay manera 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 UIWindow (como se explica en #4), el UINavigationController dibujará su imagen en el marco (0,20,320,44), dejando 20 puntos de espacio negro opaco sobre su imagen personalizada. Esto puede confundirte y hacerte pensar que eres un desarrollador inteligente que pasó por alto la regla # 1, pero estás equivocado. La barra de navegación todavía tiene 64 puntos de altura. Incrustar un controlador UINavigationController en una jerarquía de vista de estilo de diapositiva para revelar lo hace muy claro.

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

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

  8. UINavigationController y UITabBarController también intentarán rellenar los contentInsets de las vistas de tabla y las vistas de colección en su jerarquía de sub-vistas. Lo hace de una manera similar a la lógica de la barra de estado de #4. Hay una forma programática de evitar esto, configurando automáticamente Yadjustsscrollviewinsets en NO para sus vistas de tabla y vistas de colección (por defecto es YES). Esto planteó algunos problemas serios para Whisper y Riposte, ya que usamos contentInset ajustes para controlar el diseño de las vistas de tabla en respuesta a los movimientos de la barra de herramientas y el teclado.

  9. Para reiterar: no hay forma de volver a la lógica de diseño de la barra de estado de estilo iOS 6. Para aproximarse a esto, debe mover todos los controladores de vista de su aplicación a una vista de contenedor que está desplazada por 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 antigua. Este es el método que terminamos usando en Contestación y Susurra.

  10. Apple está presionando muy duro para asegurarse de que no intentes hacer el # 9. Quieren que rediseñemos todas nuestras aplicaciones para subarrendar la barra de estado. Sin embargo, hay muchos argumentos convincentes, tanto por la experiencia del usuario como por razones técnicas, por lo que esto no siempre es una buena idea. Usted debe hacer lo que es mejor para sus usuarios y no simplemente seguir el capricho de la plataforma.

 450
Author: jaredsinclair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-17 16:49:18

Actualizaciones el 19 de septiembre de 2013:

corrección de errores de escalado mediante la adición self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

errores tipográficos corregidos en la declaración NSNotificationCenter


Actualizaciones el 12 de septiembre de 2013:

corregido UIViewControllerBasedStatusBarAppearance a NO

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

se ha añadido un enfoque para cambiar el color de fondo del estado Bar.


Aparentemente no hay manera 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 iOS6, y esta es la forma más corta que se me ocurre:

  1. Establecer UIViewControllerBasedStatusBarAppearance a NO en info.plist (Para optar por no tener controladores de vista ajustar el estilo de la barra de estado para que podamos establecer el estilo de la barra de estado mediante el UIApplicationstatusBarStyle método.)

  2. En el application:didFinishLaunchingWithOptions de AppDelegate, llama

    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;
    


Para:

  1. Comprueba si es iOS 7.

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

  3. Evite que aparezcan subviews cuyos marcos se extienden más allá de los límites visibles (para vistas que se animan en la vista principal desde la parte superior).

  4. Crear 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 agregando

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

En if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) y crear 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, se activará una instrucción switch para detectar la orientación de la pantalla de la aplicación (Vertical, Al Revés, Horizontal a la Izquierda o Horizontal a la Derecha) y cambie 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 la barra de estado:

Añadir

 @property (retain, nonatomic) UIWindow *background;

En AppDelegate.h para hacer background una propiedad en su clase y evitar que ARC la desasigne. (No tiene que hacerlo si no está utilizando ARC.)

Después de eso, solo tiene que crear la ventana UIWindow 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!

 121
Author: Archy Wilhes 魏何,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-04 17:36:51

ACTUALIZACIÓN (NUEVA SOLUCIÓN)

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

Nota : Si utiliza el Controlador de navegación predeterminado, utilice la solución antigua.

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 utiliza el código anterior, ignore el siguiente Código e Imagen

Esto es versión antigua 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; comienza en 0 píxeles.

Nota: Los Deltas de iOS 6/7 solo aparecen si desmarca "Usar diseño automático" para el Controlador de vista en el" Inspector de archivos " (icono de la izquierda) en los detalles panel.

Introduzca la descripción de la imagen aquí

 40
Author: İbrahim Özbölük,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-04 19:36:25

SOLUCIÓN:

Establézcalo en su viewcontroller o en rootviewcontroller reemplazando el método:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }
 26
Author: dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-28 15:40:36

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

OBJETIVO:

El objetivo de este enfoque es recrear el mismo estilo de barra de estado en iOS7 que había en iOS6(consulte el título de la pregunta " Barra de estado de iOS 7 Volver al estilo de iOS 6?").

RESUMEN:

Para lograr esto, usamos el guion gráfico tanto como sea posible al cambiar los elementos de la interfaz de usuario 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 adicional resultante en iOS 7 es ocupado por un UIView con el color de fondo establecido en un color de nuestra elección. Este último se puede crear en código o utilizando el Storyboard (ver ALTERNATIVAS a continuación)

SUPUESTOS:

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

PASOS:

  • Agregue una subview a la ventana UIWindow para que sirva como fondo de la barra de estado. Para lograr esto, agregue lo siguiente a application: didFinishLaunchingWithOptions: de su AppDelegate 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];
    }
    
  • Dado que agregó un fondo SOLO para iOS 7 mediante programación, tendrá que ajustar el diseño de los elementos de la interfaz de usuario que se superponen con la barra de estado en consecuencia, conservando su diseño para iOS6. Para lograr esto, haga lo siguiente:

    • Asegúrese de que Use Autolayout no esté marcado para su guion gráfico (esto se debe a que, de lo contrario, "iOS 6/7 Deltas" no se muestra en el Inspector de tamaño). Para hacer esto:
      • seleccione su archivo de Storyboard
      • mostrar Utilidades
      • seleccione "Mostrar el inspector de archivos"
      • En" Interface Builder Document "desmarque"Use Autolayout"
    • Opcionalmente, para ayudarlo a monitorear los cambios de diseño para iOS 7 Y 6 a medida que los aplique, seleccione el "Editor asistente", seleccione "Vista previa" y " iOS 6.1 o anterior": introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí
    • Ahora seleccione el elemento de interfaz de usuario que desea ajustar para que ya no se superponga con la barra de estado
    • Seleccione "Mostrar el inspector de tamaño" en la columna Utilidades
    • Reposiciona el elemento UI a lo largo del eje Y en la misma cantidad que la altura de la barra de estado bg: introduzca la descripción de la imagen aquí
    • Y cambie el valor de los deltas iOS6/7 para Y por la misma cantidad NEGATIVA que la barra de estado bg altura (Tenga en cuenta el cambio en la vista previa de iOS 6 si lo está utilizando): introduzca la descripción de la imagen aquí

ALTERNATIVAS:

Para agregar aún menos código en proyectos pesados de storyboard y tener la barra de estado de fondo autorotado, en lugar de agregar programáticamente un fondo para su barra de estado, podría agregar una vista de color a cada controlador de vista que se encuentra en la parte superior de la vista principal de dicho viewcontroller. A continuación, cambiaría la altura delta de esta nueva vista a la misma cantidad negativa como la altura de la vista (para hacerla desaparecer en iOS 6).

La desventaja de esta alternativa (aunque tal vez insignificante teniendo en cuenta la compatibilidad con autorotado) es el hecho de que esta vista adicional no es visible inmediatamente si está viendo su guion gráfico para iOS 6. Solo sabrías que está allí si echaras un vistazo al" Esquema del documento " del guion gráfico.

 17
Author: sts2055,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-04 15:16:29

Si no desea que sus controladores de vista se superpongan con la barra de estado (y las barras de navegación), desmarque la casilla "Extender bordes debajo de las barras superiores" en Interface Builder en Xcode 5.

Desmarque Extender Bordes Debajo de Barras superiores

 12
Author: nvrtd frst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-22 13:28:43

Lanzamiento de Apple Q&A Técnica QA1797: Evitar que la Barra de Estado cubra Sus Vistas. Funciona bien para las versiones de iOS 6 y iOS 7.

 11
Author: Igor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-16 15:54:40

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 opiniones de todos los niños sobre el yo.vista 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! ~"~

 8
Author: firestoke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 21:27:38

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

A. Establece UIViewControllerBasedStatusBarAppearance a NO en info.plist

B. En AppDelegate's application:didFinishLaunchingWithOptions:, llame:

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 añadir el método:

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

También puede considerar la subclase UIWindow para manejar UIApplicationDidChangeStatusBarOrientationNotification por sí mismo.

 6
Author: Cœur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-16 15:52:45

He utilizado esto 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];
}
 5
Author: IgniteCoders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-22 15:40:58

Prueba este sencillo método....

Paso 1 : Para cambiar en único viewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Paso 2 : Para 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 statusbar altura 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];
    }
 4
Author: svmrajesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-25 06:11:48

Hay una opción en el Creador de interfaces que llama a la propiedad Delta de iOS 6/7 que tiene como objetivo resolver el problema de desplazamiento.

Échale un vistazo en la pregunta de desbordamiento de pila Creador de interfaces: ¿Para qué sirven los Deltas iOS 6/7 de diseño de UIView?.

 3
Author: Tony Fung Choi Fung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:36

He alcanzado la barra de estado como iOS 6 en iOS 7.

Establezca UIViewController basedstatusbarappearance en NO in info.plist

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

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 sus vistas por 20 pixels.To más vienen que el uso siguiente código en -(void)viewDidAppear:(BOOL)animated método

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 WindowHeight Userdefaults después de la asignación de la 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"];
 3
Author: Desert Rose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-20 13:15:26

Si estás usando Interface builder, prueba esto:

En su archivo xib:

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

2) Asegúrese de que el fondo es una subvista autónoma posicionada como un hijo 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 tamaño automático para asegurarse de que ha bloqueado todos los bordes del marco, activado ambos ejes de flexibilidad, y si se trata de una UIImageView, establecer el modo de contenido a Escala para llenar. Programáticamente esto se traduce en contentMode establecido en UIViewContentModeScaleToFill y tiene su máscara de redimensionamiento automático establecida en (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).

3) Ahora mueve todo lo que está bloqueado de arriba hacia abajo por 20 pts y establece 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 tamaño automático el panel debe moverse hacia abajo en 20pts y tener su iOS 6/7 delta Y establecido en -20. (Cmd seleccione todos esos, y haga clic en la flecha hacia abajo 20 veces-hay una mejor manera alguien?)

4) Ajuste la altura delta de iOS 6/7 de todos los elementos anteriores que tenían una altura flexible. Cualquiera de los elementos que estaban bloqueados en la parte superior e inferior del marco y tenían la altura flexible habilitada en el panel de tamaño automático también debe tener su altura delta de iOS 6/7 establecida en 20. Eso incluye la vista de fondo mencionada arriba. Esto puede parecer anti-intuitivo, pero debido al orden en que se aplican, es necesario. La altura del fotograma se establece primero (en función del dispositivo), luego se aplican los deltas y, finalmente, las máscaras de tamaño automático se aplican en función de las posiciones de desplazamiento de todos los fotogramas 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 deltas en absoluto.

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

Por otro lado, si desea Estilo iOS7 manteniendo 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 sobre la migración de iOS7, lea la publicación completa: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html

 2
Author: thebman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 00:30:31

Mi solución fue agregar un UIView con altura de 20 puntos en la parte superior de la ventana cuando 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;

Luego creé un método para desvanecer el fondo negro de la barra de estado:

- (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;
        }
    }];
}

Todo lo que tengo que hacer ahora es llamar es [appDelegate showSolidStatusBar:YES] cuando sea necesario.

 2
Author: Alexandre OS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-27 21:12:56

Esto puede ser un problema abrumador si utiliza diseño automático porque ya no puede manipular directamente los marcos. Hay una solución simple, sin demasiado trabajo.

Terminé escribiendo un método utility en una Clase Utility y lo llamé desde todos los métodos viewDidLayoutSubviews de view controllers.

+ (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];
        }
    }

Anula tu método viewDidLayoutSubviews en el controlador de vista, donde quieres la barra de estado. Te ayudará a superar la carga del Diseño automático.

- (void)viewDidLayoutSubviews
{
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    [super viewDidLayoutSubviews];
    [MyUtilityClass addStatusBarIfiOS7:self];
}
 2
Author: Selvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-15 17:31:30

La forma más fácil de hacerlo es instalar un SDK anterior en su Xcode más reciente.

¿Cómo instalar el SDK anterior en el Xcode más reciente?

  1. U puede obtener el SDK de iOS 6.1 desde http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html o descargando un Xcode anterior y obteniendo el SDK desde su contenido

  2. Descomprima y pegue esta carpeta en / Applications / Xcode.app / Contents / Developer / Platforms / iPhoneOS.plataforma / Desarrollador / SDK

  3. Reiniciar el xcode.

  4. Ahora puedes seleccionar un SDK anterior en la configuración de compilación de tu proyecto

Espero que te ayude. Funcionó para mí =)

 1
Author: marcelosalloum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-03 19:06:25

Como usar presentViewController:animated:completion: desordenado el window.rootViewController.view, tuve que encontrar un enfoque diferente a este tema. Finalmente conseguí que funcionara con modales y rotaciones subclasificando el UIView de mi rootViewController.

.h

@interface RootView : UIView

@end

.m

@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

Ahora tiene una solución sólida para las animaciones de iOS7.

 1
Author: Cœur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 16:47:14

Llego tarde a esta respuesta, pero solo quiero compartir lo que hice, que es básicamente la solución más fácil

En primer lugar - > Vaya a su Archivo info.plist y agregue el estilo de la barra de estado - > Estilo Negro Transparente (Alfa de 0.5)

Ahora ,aquí Va:-

Añade este código en tu 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;
   }
 1
Author: Vizllx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-26 06:39:50

Mi solución muy simple (suponiendo que solo se admite la orientación vertical) es redefinir los límites de la ventana de la aplicación para las versiones de iOS por debajo de 7, en el método App delegate didFinishLaunchingWithOptions:

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];
}
 0
Author: jki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-19 14:55:07

Puede ocultar la barra de estado todos juntos. Así que tu aplicación estará a pantalla completa. Creo que es lo mejor que conseguirás.

UIStatusBarStyleNone o establecer en la configuración de destino.

 0
Author: Christopher Rex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-22 13:23:41

Pasos Para Ocultar la barra de estado en iOS 7:

1.Ve a la información de tu solicitud.archivo plist.

2.Y Establecer, Ver apariencia de la barra de estado basada en el controlador: Booleano NO

Espero haber resuelto el problema de la barra de estado.....

 0
Author: chandrika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-30 11:43:30

Para seguir trabajando con setStatusBarHidden: Utilizo esta categoría:

@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
 0
Author: Tomer Even,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-08 21:25:46

He encontrado aquí es las mejores alternativas y solución para este problema de la barra de navegación en iOS7!!

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

Espero que aclare todas nuestras preguntas y preocupaciones.

 0
Author: simbesi.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-26 06:30:30

Esto podría ser demasiado tarde para compartir, pero tengo algo que contribuir que podría ayudar a alguien, estaba tratando de subclasificar la UINavigationBar y quería que se viera como ios 6 con barra de estado negra y texto de barra de estado en blanco.

Esto es lo que encontré trabajando para eso

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

Hizo que mi fondo de la barra de estado fuera negro, el texto de la barra de estado blanco y el color blanco de la barra de navegación.

IOS 9.3, XCode 7.3.1

 0
Author: channi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-31 11:16:30