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

292

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

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

  • Es genial, pero arruinará un poco su vista cuando tenga algo en la parte superior de su vista, y se superpondrá 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 [sin superponerse] a cómo está en iOS6?

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

  • Realmente me alegraría si alguien me puede proporcionar una solución única para esto.

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

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

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

吖 奇 说 - 何魏奇 Archy Will He
fuente
66
Lamentablemente, las barras de estado negras quedaron en desuso en
iOS
Voy a estar de acuerdo con @GangstaGraham. ¡Esos colores son simplemente hermosos ! Para responder a su pregunta, me temo que no puede. La razón por la cual la barra de estado está diseñada ahora es porque la translucidez es lo nuevo de iOS y está diseñada para dar "profundidad" a una aplicación diciendo que está encima de algo, por lo que hay algo debajo.
Cole Johnson
¿Has intentado configurar preferredStatusBarStyle a UIStatusBarDefault? Checkout iOS 7 UIViewController Documentation
theaob
1
Tener UIStatusBarDefaultpara la barra de estado solo hace que su contenido sea de color negro. No va a hacer que la forma en que funciona vuelva a ser como es en iOS6.
吖 奇 说 - 何魏奇 Archy Will He
2
¿Alguna suerte con esto? ¡Amo iOS7 pero esto me está volviendo loco!
Mihai Fratu

Respuestas:

449

Esto está publicado en una publicación de blog que escribí , pero aquí está el resumen completo de las 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 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 la forma en que se presenta la barra de estado (marco / altura / superposición). También es importante tener en cuenta que la barra de estado del sistema ya no tiene ningún color de fondo. Cuando la API hace referencia a UIStatusBarStyleLightContent, significan 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 las dos rutas de base mutuamente excluyentes: puede configurarlas mediante programación de la manera tradicional, o UIKit actualizará la apariencia para usted en función de algunas propiedades nuevas de UIViewController. La última opción está activada por defecto. Verifique el valor de plist de su aplicación para "Apariencia de la barra de estado basada en ViewController" para ver cuál está usando. 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 de plist a NO, puede administrar la apariencia de la barra de estado utilizando los métodos de aplicación UIA conocidos.

  4. UINavigationController alterará la altura de su UINavigationBar a 44 o 64 puntos, dependiendo de un conjunto de restricciones bastante extraño e indocumentado. Si UINavigationController detecta que la parte superior del marco de su vista es visualmente contigua a la parte superior de su UIWindow, 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 de la interfaz de usuario (incluso si está apagada solo por un punto), entonces dibuja su barra de navegación de la manera "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 forma de prevenir este comportamiento.

  5. Si proporciona una imagen de fondo de la barra de navegación personalizada que solo tiene 44 puntos (88 píxeles) de alto, y los límites de la vista de UINavigationController coinciden con los límites de la UIWindow (como se discutió en el n. ° 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 confundirlo al pensar que es un desarrollador inteligente que omitió la regla # 1, pero está equivocado. La barra de navegación aún tiene 64 puntos de altura. Incrustar un UINavigationController en una jerarquía de vista de estilo deslizante para revelar lo deja muy claro.

  6. Tenga cuidado con la propiedad edgeForExtendedLayout confusamente nombrada de UIViewController. Ajustar edgeForExtendedLayout 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, luego el UINavigationController usa edgeForExtendedLayout para determinar si su controlador de vista secundario debe ser visible debajo de la barra de navegación / área de la barra de estado. Establecer edgeForExtendedLayout en el UINavigationController en sí mismo no hace nada para alterar si el UINavigationController tiene un área de barra de navegación alta de 44 o 64 puntos. 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 se superponga a la barra de navegación dentro de un UINavigationController, establezca edgeForExtendedLayout en UIRectEdgeNone (o al menos una máscara que excluya UIRectEdgeTop). Establezca este valor lo antes posible en el ciclo de vida de su controlador de vista.

  8. UINavigationController y UITabBarController también intentarán rellenar los ContentInsets 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 del # 4. Hay una forma programática de evitar esto, estableciendo automáticamenteAjustesScrollViewInsets en NO para sus vistas de tabla y vistas de colección (el valor predeterminado es SÍ). Esto planteó algunos problemas serios para Whisper y Riposte, ya que usamos los ajustes de ContentInset para controlar el diseño de las vistas de la 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 del 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é compensada 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 anterior. Este es el método que terminamos usando en Riposte y Whisper.

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

jaredsinclair
fuente
35
Solo quería agregar que puede agregar una restricción a lo que esté en la parte superior de su vista para que se adjunte a la guía de diseño superior; esto dejará un espacio en blanco detrás de la barra de estado (que puede completar con el color que desee) pero también permitirá que la vista se ajuste automáticamente a la posición correcta en iOS 6 también. De esa manera, no tiene que ajustar manualmente la posición de sus vistas en el código.
BreadicalMD
44
Esa es una solución brillante. Has expuesto mi ignorancia en AutoLayout. Mejor sube a eso.
jaredsinclair
1
Si coloca el espacio superior de su objeto debajo del borde de la guía de diseño superior, puede usar el control de restricción para agregar una restricción de espaciado vertical al vecino más cercano, que ahora será la guía de diseño superior. Alternativamente, puede usar ctrl + clic desde su objeto a la guía de diseño superior para agregar una restricción de espacio vertical explícitamente.
BreadicalMD
2
@BreadicalMD Una parte que no entiendo es que -topLayoutGuide no está disponible en iOS 6, entonces, ¿eso significa que necesita usar diferentes restricciones de diseño automático en iOS 7 y 6?
Jeremy
1
Gran respuesta ... Pero tengo una duda 1) UINavigationController que altera la parte de altura. Explícalo un poco más. gracias
user1010819
122

Actualizaciones el 19 de septiembre de 2013:

Se corrigieron errores de escala agregando self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

errores tipográficos corregidos en la NSNotificationCenterdeclaración


Actualizaciones el 12 de septiembre de 2013:

corregido UIViewControllerBasedStatusBarAppearanceaNO

Se 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 iOS6, y esta es la forma más corta que puedo encontrar:

  1. Establecer UIViewControllerBasedStatusBarAppearancea NOdeinfo.plist (Para optar por que los controladores de vista ajustar el estilo de barra de estado para que podamos establecer el estilo de barra de estado utilizando el método UIApplicationstatusBarStyle).

  2. En AppDelegate's application:didFinishLaunchingWithOptions, llame

    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. Comprueba si es iOS 7.

  2. Establezca el contenido de la barra de estado para que sea blanco, en lugar de UIStatusBarStyleDefault.

  3. Evite que aparezcan subvistas cuyos marcos se extienden más allá de los límites visibles (para las vistas que animan a 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 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 cambie la orientación, se activará una instrucción de cambio para detectar la orientación de la pantalla de la aplicación (vertical, invertida, 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.hpara hacer backgrounduna propiedad en su clase y prevenir arco desde desasignar ella. (No tiene que hacerlo si no está utilizando ARC).

Después de eso, solo necesita crear la 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 @implementation AppDelegate!

吖 奇 说 - 何魏奇 Archy Will He
fuente
3
Esto se rompe en la rotación. solo un
aviso
2
@JesseNaugher Recomiendo modificar la restricción de espacio vertical de 0 a 20 mediante programación. Funcionará en rotación.
experto
2
¿Alguna idea de cómo podemos evitar que la barra de navegación se expanda 20 píxeles? Esta solución está bien para mí, pero mi barra de navegación tiene 20 píxeles de altura.
simonbs
44
@ArchyHolt: Su solución simple funciona para mí, excepto cuando presento un controlador de vista modal. Una vez que se descarta el controlador de vista modal, la vista restante ahora está debajo de la barra de estado. He reproducido esto en un nuevo proyecto de muestra para garantizar que no haya nada más funky. Creo que su solución más avanzada podría ser útil aquí, pero no estoy seguro de qué notificación entraría en juego. ¿Algunas ideas?
markdorison
44
La vista se restablece después de descartar un controlador de vista modal. :(
KarenAnne
41

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 configurar el ejemplo de color de la barra de navegación: FakeNavBar.backgroundColor = [UIColor redColor];

Nota: Si usa el controlador de navegación predeterminado, use una 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 ANTERIOR: 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 Deltas solo aparece si desmarca "Usar Autolayout" para el Controlador de vista en el "Inspector de archivos" (icono de la izquierda) en el panel de detalles.

Ingrese la descripción de la imagen aquí

İbrahim Özbölük
fuente
66
Me alegraste el día ¡Toma +1 por la ayuda!
Niru Mukund Shah
55
Tenga en cuenta: iOS 6/7 Deltas solo aparece si desmarca "Usar Autolayout" para el Controlador de vista en el "Inspector de archivos" (icono de la izquierda) en el panel de detalles.
Matt
1
¡Muchas gracias! Me salvaste muchos problemas!
neowinston
2
¿Quién dijo que el diseño de la barra de estado del estilo iOS 6 no se puede mantener? Puede hacerlo de la manera @ TacettinÖzbölük ... gracias amigo por esta solución de awsum.
Vizllx
1
¡Buena esa! también, solo para notar que Apple prefiere esto ahora: if (NSFoundationVersionNumber> = NSFoundationVersionNumber_iOS_6_1) {}
Joel Balmer
26

SOLUCION:

Configúrelo en su viewcontroller o en rootviewcontroller anulando el método:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }
Dave
fuente
No es una mala solución. Retire completamente la barra. Puede que no sea ideal para UX todo el tiempo, pero viable.
Farhan Hafeez
Simplemente sorprendente. Trabajó para mí sin problemas.
madLokesh
Escenario: una vez que vuelva a mi UIVIew después de reproducir el video a pantalla completa, aparece una barra negra en la parte inferior que es solo el tamaño de la barra de estado, aunque ya estaba usando una barra de estado. Eliminé la barra de estado por completo y ahora el problema está solucionado.
madLokesh
Solo he tenido éxito con este método
user2277872
17

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 Storyboard tanto como sea posible cambiando los elementos de la interfaz de usuario que se superponen con la barra de estado (en iOS 7) hacia abajo, mientras que 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 una UIView con el backgroundColor configurado en un color de nuestra elección. Este último se puede crear en código o usando el Storyboard (ver ALTERNATIVAS a continuación)

Suposiciones

Para obtener el resultado deseado al seguir los pasos a continuación, se supone que View controller-based status bar appearanceestá establecido en NO y que suStatus bar style está configurado 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 subvista a la UIWindow para que sirva como fondo de la barra de estado. Para lograr esto, agregue lo siguiente a su AppDelegate application: didFinishLaunchingWithOptions:despuésmakeKeyAndVisible

    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ó mediante programación un fondo SOLO para iOS 7, tendrá que ajustar el diseño de los elementos de su interfaz de usuario que se superponen en consecuencia con la barra de estado al tiempo que conserva su diseño para iOS6. Para lograr esto, haga lo siguiente:

    • Asegurarse de que Use Autolayout esté desmarcado para su Storyboard (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 "Documento del generador de interfaces" desmarque "Usar Autolayout"
    • Opcionalmente, para ayudarlo a monitorear los cambios de diseño para iOS 7 Y 6 a medida que los aplica, seleccione el "Editor Asistente", seleccione "Vista previa" y "iOS 6.1 o anterior": ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí
    • Ahora seleccione el elemento de la interfaz de usuario que desea ajustar para que la barra de estado ya no se superponga
    • Seleccione "Mostrar el inspector de tamaño" en la columna Utilidades
    • Vuelva a colocar su elemento UI a lo largo del eje Y en la misma cantidad que la altura de bg de la barra de estado: ingrese la descripción de la imagen aquí
    • Y cambie el valor de Deltas iOS6 / 7 para Y por la misma cantidad NEGATIVA que la altura de bg de la barra de estado (tenga en cuenta el cambio en la vista previa de iOS 6 si lo está usando): ingrese la descripción de la imagen aquí

ALTERNATIVAS:

Para agregar aún menos código en proyectos con muchos guiones gráficos y hacer que el fondo de la barra de estado gire automáticamente, en lugar de agregar un fondo para su barra de estado mediante programación, puede agregar una vista en color a cada controlador de vista que se encuentra en la parte superior de la vista principal de dicho controlador de vista. Luego, cambiaría el delta de altura de esta nueva vista a la misma cantidad negativa que la altura de su vista (para que desaparezca en iOS 6).

La desventaja de esta alternativa (aunque puede ser insignificante teniendo en cuenta la compatibilidad de autorrotación) es el hecho de que esta vista adicional no es visible de inmediato si está viendo su Storyboard para iOS 6. Solo sabría que está ahí si echa un vistazo a " Esquema del documento "del guión gráfico.

sts2055
fuente
12

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

Desmarca los bordes extendidos debajo de las barras superiores

nvrtd primero
fuente
77
Esto solo es posible si usa un guión gráfico
Cœur el
3
Solo funciona con contenedores vcs como el controlador de navegación o el controlador de barra de pestañas
Andrea
2
edgeForExtendedLayout solo es utilizado por los controladores de vista de contenedor (como UINavigationController) para determinar si las vistas de los niños deben superponerse con el cromo de los padres. Establecer esta propiedad en el controlador de vista raíz para UIWindow no hace nada. Vea mi respuesta anterior: stackoverflow.com/questions/18294872/…
jaredsinclair
¿Cómo lo haces para un UITabBarController @Andrea? Gracias.
KarenAnne
@KarenAnne Depende si lo haces mediante programación o con guiones gráficos. Programáticamente solo necesita establecer la propiedad edgeForExtent a lo que le gusta en el controlador de vista que está mostrando dentro del UITabBarViewController, pero para no tener el problema de la barra de estado debe cargar un controlador de navegación dentro del UITabbarController. Chequea aquí. developer.apple.com/library/ios/documentation/UserExperience/…
Andrea
11

Apple lanzó Preguntas y respuestas técnicas QA1797: Prevención de que la barra de estado cubra sus vistas . Funciona bien para las versiones iOS 6 e iOS 7.

Igor
fuente
55
Apple está asumiendo que todos están usando el diseño automático. El diseño automático fue horrible en Xcode 4, y Xcode 5 se acaba de lanzar, por lo que esta es una suposición dudosa.
Glenn Maynard
1
Pero en perspectiva, esta es una mejor solución que redimensionar el marco de la ventana raíz o la barra de estado.
Igor
Por lo que puedo decir, la solución de Apple no funciona si su rootViewController es un splitViewController.
Vern Jensen
8

He visto 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 todas las vistas de los niños en la vista propia con 20 píxeles. Eso es todo. Luego, la captura de pantalla se mostrará tal como lo hizo iOS 6. ¡Odio la barra de estado de iOS7! ~ "~

fuego de fuego
fuente
2
¿Dónde debo agregar esto? en la aplicación delegado se lanzó con opciones?
mhmdshawqi
Cuando hago esto, mi barra de estado se vuelve blanca
ropo
6

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

a. Establecer UIViewControllerBasedStatusBarAppearancea NOen info.plist

si. En AppDelegate's application:didFinishLaunchingWithOptions:, llame al:

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 agregue el método:

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

También puede considerar subclasificar UIWindowpara manejarse UIApplicationDidChangeStatusBarOrientationNotificationsolo.

Coeur
fuente
¿tiene problemas con presentViewController: animado: finalización:?
Tüng Đỗ
@ TùngĐỗ cierto, así que hice una alternativa que funciona mejor: stackoverflow.com/questions/18294872/…
Cœur
5

Usé 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];
}
IgniteCoders
fuente
1
Trabajó como un encanto, y muy fácil. En movimiento rubí, antes de la llamada al super uso: self.edgesForExtendedLayout = UIRectEdgeNone si respondeToSelector ("edgeForExtendedLayout")
tehprofessor
4

Prueba este método simple ...

Paso 1 : cambiar en singleviewController

[[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 uno viewWillAppearpara ajustar la statusbaraltura paraiOS7

    [[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];
    }
Rajesh Loganathan
fuente
3

He alcanzado la 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 *)launchOptionsmé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 reducir todas sus vistas en 20 píxeles. Para hacerlo, use el siguiente código en el -(void)viewDidAppear:(BOOL)animatedmé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 predeterminado de windowHeight User después de la asignación de ventana en didFinishLauncing Method como

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];
Rosa del desierto
fuente
Un mejor enfoque es hacer que su UINavigationBar sea heightigual a 64 en lugar de 44. Luego, su barra se extenderá hasta la parte superior como en las aplicaciones de Apple.
Aaron Brager
@AaronBrager Pero mi requisito era mostrar la barra de estado de estilo iOS 6.
Desert Rose
¿Puede agregar la solución para Orientación horizontal iOS 7 ?. Estoy haciendo lo mismo pero no funciona en iOS 7 Landscape.
sathiamoorthy
@DesertRose THX! Esto funciona para mí, pero corta la barra uitabbar en la parte inferior. Tengo una aplicación basada en el controlador de barra de pestañas con 3 vistas, 2 de las cuales son tableviewcontrollers.
marciokoko
1
HASTA que gire el dispositivo (mi dispositivo iOS 7 es un iPad), esto lo arregla perfectamente. Pero una vez que giro, la barra negra permanece exactamente donde está y la "vista" (perdón si ese es el término técnico incorrecto, soy un usuario de PhoneGap / web) mantiene su altura reducida, excepto que ya no es la altura, es la anchura. Esta solución no admite la rotación, pero es la mejor solución que he visto: ¿cómo se puede mejorar para ver las rotaciones del dispositivo? ¡Gracias!
tylerl
2

Si está utilizando el generador de interfaces, intente esto:

En su archivo xib:

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

2) Asegúrese de que el fondo sea una subvista autónoma posicionada como un elemento secundario de nivel superior de la vista del controlador.
Mueva su fondo para convertirse en un hijo directo de la vista del controlador. Verifique 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 un UIImageView, configure el modo de contenido en Escalar para rellenar. Programá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 en la parte superior - hacia abajo en 20 pts y configure un iOS 6/7 delta Y en -20.
Todos los niños de nivel superior que están bloqueados en el marco superior en el panel de tamaño automático deben moverse 20 puntos hacia abajo y tener 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 de que 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 estaban bloqueados en la parte superior e inferior del marco y tenían una altura flexible habilitada en el panel de tamaño automático también debe tener su altura delta 6/7 de iOS establecida en 20. Eso incluye la vista de fondo mencionada anteriormente. Esto puede parecer anti-intuitivo, pero debido al orden en que se aplican, es necesario. La altura del cuadro se establece primero (según el dispositivo), luego se aplican los deltas y finalmente se aplican las máscaras de tamaño automático 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 cuadro inferior pero no en el cuadro superior no necesitan deltas.

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

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

thebman
fuente
No hay deltas cuando se usa el diseño automático
lostintranslation
2

Mi solución fue agregar una UIViewaltura 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;

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 [appDelegate showSolidStatusBar:YES]cuando sea necesario.

Alexandre OS
fuente
2

Esto puede ser un problema abrumador si usa el 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 de utilidad en una Clase de utilidad y lo llamé desde el viewDidLayoutSubviewsMétodo de todos los controladores de vista .

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

Anule su viewDidLayoutSubviewsmétodo en el controlador de vista, donde desea la barra de estado. Te llevará a través de la carga de Autolayout.

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

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 nuevo?

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

  2. Descomprima y pegue esta carpeta en /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs

  3. Reinicie el xcode.

  4. Ahora puede seleccionar un SDK anterior en la configuración de compilación de su proyecto

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

marcelosalloum
fuente
trabajó para mi. gracias @marcelosalloum pero sigo buscando una solución alternativa para mi aplicación phonegap (uiwebview) para admitir la barra de estado transparente de iOS7 para futuras actualizaciones de mi aplicación. gracias de nuevo. ;)
Hanism
@marcellosaloum, ¿estás seguro de que Apple aceptará la aplicación? Dijeron que las aplicaciones compiladas con XCode 4 ya no serían aceptadas ... eso de hecho significa iOS 6 SDK.
Valerio
De hecho, mi aplicación fue aceptada porque Xcode5 puede compilar SDK de iOS más antiguos. No estoy seguro de si AppStore rechazará las aplicaciones integradas de Xcode4 pero (Xcode4! = IOS 6 SDK) como usted dijo.
marcelosalloum
¿Fue eso después del 1 de febrero? En ese día Apple lo hizo obligatorio.
Valerio
No, la última vez que toqué ese código el año pasado, gente. No sabía que Apple lo había hecho obligatorio (aunque no me alegra saberlo). ¿Podría publicar aquí el enlace que dice eso? Saludos
marcelosalloum
1

Al usar el presentViewController:animated:completion:desordenado window.rootViewController.view, tuve que encontrar un enfoque diferente para este problema. Finalmente pude trabajar con modales y rotaciones subclasificando la UIView de mi 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

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

Coeur
fuente
1

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 info.plistarchivo y agregue Estilo de barra de estado-> Estilo negro transparente (Alfa de 0.5)

Ahora, aquí va: -

Agregue este código en su 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;
   }
Vizllx
fuente
0

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 inferiores a 7, en el método delegado de la aplicación 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];
}
jki
fuente
Su código solo cambia la 'y' de 0 a 20 pero no ajusta la altura en consecuencia, por lo que debe agregar screenBounds.size.height - = 20; justo después de screenBounds.origin.y = 20;
Amit C.
0

Puede ocultar la barra de estado todos juntos. Entonces su aplicación será de pantalla completa. Creo que eso es lo mejor que obtendrás.

UIStatusBarStyleNone o establecer en la configuración de destino.

Christopher Rex
fuente
2
dónde especificar UIStatusbarstylenone
user4951
0

Pasos para ocultar la barra de estado en iOS 7:

1.Vaya al archivo info.plist de su aplicación.

2.Y establecer, ver la apariencia de la barra de estado basada en el controlador: booleano NO

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

chandrika
fuente
0

Para continuar trabajando con setStatusBarHidden: uso 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
Tomer Even
fuente
0

Puede que sea demasiado tarde para compartir, pero tengo algo que aportar que podría ayudar a alguien, estaba tratando de subclasificar la barra de navegación UIN y quería que pareciera 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 el fondo de mi barra de estado fuera negro, el texto de la barra de estado blanco y el color de la barra de navegación blanco.

iOS 9.3, XCode 7.3.1

channi
fuente