En iOS 7, UIStatusBar
se ha diseñado de manera que se combina con la vista de esta manera:
(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 diferenteself.view.center.x
puede 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 didFinishLaunchingWithOptions
método, pero eso es una solución, un atajo que evita el problema, por lo que no considero que sea una solución real.
UIStatusBarDefault
para 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.Respuestas:
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:
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
fuente
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:
Establecer
UIViewControllerBasedStatusBarAppearance
aNO
deinfo.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).En AppDelegate's
application:didFinishLaunchingWithOptions
, llamea fin de que:
Comprueba si es iOS 7.
Establezca el contenido de la barra de estado para que sea blanco, en lugar de UIStatusBarStyleDefault.
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).
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
en
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
y crear un nuevo método en AppDelegate: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
en
AppDelegate.h
para hacerbackground
una 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)
:¡No te olvides de
@synthesize background;
después@implementation AppDelegate
!fuente
Resolví el problema con el siguiente código. Esto es para agregar una barra de estado. didFinishLaunchingWithOptionsY 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.fuente
SOLUCION:
Configúrelo en su viewcontroller o en rootviewcontroller anulando el método:
fuente
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 appearance
está 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
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:
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: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.
fuente
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.
fuente
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.
fuente
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í:
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! ~ "~
fuente
Una pequeña alternativa a la respuesta de Archy Holt, un poco más simple:
a. Establecer
UIViewControllerBasedStatusBarAppearance
aNO
en info.plistsi. En
AppDelegate
'sapplication:didFinishLaunchingWithOptions:
, llame al:Y agregue el método:
También puede considerar subclasificar
UIWindow
para manejarseUIApplicationDidChangeStatusBarOrientationNotification
solo.fuente
Usé esto en todos mis controladores de vista, es simple. Agregue estas líneas en todos sus métodos viewDidLoad:
fuente
Prueba este método simple ...
Paso 1 : cambiar en single
viewController
Paso 2 : cambiar en toda la aplicación
Paso 3 : también agregue esto en cada uno
viewWillAppear
para ajustar lastatusbar
altura paraiOS7
fuente
Hay una opción en Interface Builder que llama a la propiedad Delta de iOS 6/7 que tiene como objetivo resolver el problema de compensación.
Míralo en la pregunta de desbordamiento de pila Creador de interfaces: ¿Para qué sirven los diseños Delta UIView de iOS 6/7? .
fuente
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 *)launchOptions
métodoPuede reducir todas sus vistas en 20 píxeles. Para hacerlo, use el siguiente código en el
-(void)viewDidAppear:(BOOL)animated
métodoDebe establecer el valor predeterminado de windowHeight User después de la asignación de ventana en didFinishLauncing Method como
fuente
height
igual a 64 en lugar de 44. Luego, su barra se extenderá hasta la parte superior como en las aplicaciones de Apple.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
fuente
Mi solución fue agregar una
UIView
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". Enapplication:didFinishLaunchingWithOptions:
:Luego creé un método para desvanecer el fondo negro de la barra de estado:
Todo lo que tengo que hacer ahora es llamar
[appDelegate showSolidStatusBar:YES]
cuando sea necesario.fuente
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
viewDidLayoutSubviews
Método de todos los controladores de vista .Anule su
viewDidLayoutSubviews
método en el controlador de vista, donde desea la barra de estado. Te llevará a través de la carga de Autolayout.fuente
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?
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
Descomprima y pegue esta carpeta en /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
Reinicie el xcode.
Espero que te ayude. Funcionó para mí =)
fuente
Al usar el
presentViewController:animated:completion:
desordenadowindow.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
.metro
Ahora tiene una solución alternativa sólida para las animaciones de iOS7.
fuente
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.plist
archivo 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
fuente
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:
fuente
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.fuente
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 .....
fuente
Para continuar trabajando con setStatusBarHidden: uso esta categoría:
fuente
¡¡Aquí encontré las mejores alternativas y soluciones 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 consultas y preocupaciones.
fuente
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
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
fuente