Estoy usando Xcode 8.0 beta 4.
En la versión anterior, UIViewController tenía un método para establecer el estilo de la barra de estado
public func preferredStatusBarStyle() -> UIStatusBarStyle
Sin embargo, descubrí que cambió a "Obtener SOLO varaiable" en Swift 3.
public var preferredStatusBarStyle: UIStatusBarStyle { get }
¿Cómo puedo proporcionar el estilo para usar en mi UIViewController?

Respuestas:
[ACTUALIZADO] Para Xcode 10+ y Swift 4.2+
Este es el método preferido para iOS 7 y superior
En su aplicación
Info.plist, configureView controller-based status bar appearanceenYES.Anular
preferredStatusBarStyle( documentos de Apple ) en cada uno de sus controladores de vista. Por ejemplo:Si ha
preferredStatusBarStyledevuelto un estilo de barra de estado preferido diferente basado en algo que cambia dentro de su controlador de vista (por ejemplo, si la posición de desplazamiento o si una imagen mostrada es oscura), entonces querrá llamarsetNeedsStatusBarAppearanceUpdate()cuando ese estado cambie.iOS anterior a la versión 7, método obsoleto
Apple ha desaprobado esto , por lo que se eliminará en el futuro. Utilice el método anterior para no tener que volver a escribirlo cuando se lance la próxima versión de iOS.
Si su aplicación será compatible con la de su aplicación
Info.plist, configureView controller-based status bar appearanceenNO.En
appDelegate.swiftladidFinishLaunchingWithOptionsfunción, agregue:Para el controlador de navegación
Si utiliza un controlador de navegación y desea que el estilo de barra de estado preferido de cada controlador de vista que se utilizará y establece
View controller-based status bar appearancequeYESen sus aplicaciones deinfo.plistfuente
Última actualización (Xcode 10+ / Swift 4.2+)
Este artículo se deja intacto para cualquiera que esté dispuesto a comprender la lógica detrás de los diferentes enfoques que estuvieron presentes durante los últimos años. Mientras tanto, a partir de Xcode 10, el primer enfoque de Swift 4.2 está en desuso y ya no es compatible (es decir , no tendrá efecto si intenta utilizarlo). Todavía se refiere a su información para comprender mejor el razonamiento detrás de la
Plist.infopráctica de la bandera y la personalización.Aclaraciones importantes
Es muy importante comprender dos enfoques para personalizar la apariencia de la barra de estado. Son diferentes y no deben mezclarse.
Primer enfoque: un color para toda la aplicación (DEPRECADO desde iOS7)
En info.plist encuentras o creas una clave llamada
View controller-based status bar appearancey póngalo en NO .
¿Que hace? Básicamente, establece una configuración que dice que en su aplicación, la apariencia de la barra de estado no está definida individualmente por cada controlador de vista . Esto es súper importante de entender. Esto significa que tiene una configuración uniforme para toda la aplicación, para todas las pantallas. Hay dos configuraciones:
defaultque es texto negro sobre fondo blanco olightContenttexto blanco sobre fondo negro.Para configurar uno de estos ( una configuración para todas las pantallas ):
De esta manera, no necesitará restablecer esta configuración en cada controlador de vista. Sin embargo, siempre puede recurrir a este método para cambiar voluntariamente la apariencia.
Segundo enfoque: color individual para cada controlador de vista
Esto es lo contrario. Para que funcione, vaya a info.plist y configure
View controller-based status bar appearancea SÍ
De esta manera, cada vez que se abre un nuevo controlador de vista, el estilo de la barra de estado se configura individualmente si inserta esta implementación en cada
UIViewControllerinstancia que necesita:Tiene lo mismo que en el primero, configure el estilo oscuro o claro para la barra de estado, individual para cada controlador de vista.
UIKit obtiene esta propiedad en dos escenarios:
setNeedsStatusBarAppearanceUpdate()en el código.En este último caso, puede manipular la apariencia de la barra de estado con el siguiente código:
Entonces, cuando llames
toggleAppearance(), se activará el cambio de estilo de la barra de estado.Tercer enfoque: ¡Hack!
Hay un truco que permite acceder a la barra de estado directamente:
¿Por qué hackear? Si necesita un color de barra de estado que no sea blanco o negro, use una API no documentada. Obtiene el
statusBarobjeto usando KVC y establece su color de fondo. El objeto que se obtiene de esta manera esUIStatusBar, que se derivaUIViewy, por lo tanto, naturalmente es compatible con labackgroundColorpropiedad. Esta es una forma sucia, no legal, pero hasta ahora es la única forma de configurar el color personalizado para la barra de estado (sin tener en cuenta elUINavigationBarenfoque, lo que permite personalizar la apariencia de la barra de estado + barra de estado por completo). Es muy posible que su aplicación sea rechazada. Pero tal vez tengas suerte. Y si es así, en ciertas circunstancias complejas (como la jerarquía de controladores de vista y navegación secundarios anidados), esta puede ser la única forma, o al menos la menos problemática, de personalizar la apariencia de la barra de estado (por ejemplo, para que sea transparente)Xcode 10+, Swift 4.2
Ya no hay alternativas: el desarrollador debe permitir que cada controlador de vista defina la apariencia de la barra de estado, estableciendo el indicador en SÍ (u omitiendo esta acción, porque es SÍ de forma predeterminada) y siguiendo las instrucciones anteriores.
Prima
Solución basada en pirateo que puede (aunque no se recomienda) usar en circunstancias complejas para cambiar voluntariamente la apariencia de la barra de estado en cualquier etapa. En cuanto al color, el siguiente método de extensión hace exactamente lo que podría haber hecho con un enfoque regular. Puedes ajustarlo a tus necesidades.
fuente
Podría intentar anular el valor devuelto, en lugar de configurarlo. El método se declara como {get}, así que solo proporcione un getter:
Si configura esto condicionalmente, deberá llamar
setNeedsStatusBarAppearanceUpdate()para animar el cambio cuando esté listofuente
prefersStatusBarHiddenalgunas de sus vistas. Si vas conUIApplication.shared.statusBarStyleeso, te quedarás atrapado.Swift 3 y 4, iOS 10 y 11, Xcode 9 y 10
Para mí, este método no funciona:
cuando solía ver cada controlador de vista, pero esto funcionó:
En el archivo info.list, agregue fila:
View controller-based status bar appearancey configúrelo enNOSiguiente en appdelegate:
fuente
Si desea cambiar el
statusBarcolor de 's a blanco, para todas las vistas contenidas en aUINavigationController, agregue esto dentroAppDelegate:Este código:
no funciona para
UIViewControllerscontenido en aUINavigationController, porque el compilador busca el contenidostatusBarStyledelUINavigationController, nostatusBarStyleelViewControllerscontenido del contenido.¡Espero que esto ayude a aquellos que no han tenido éxito con la respuesta aceptada!
fuente
Si desea cambiar el estilo de la barra de estado en cualquier momento después de que aparezca la vista, puede usar esto:
En el archivo info.list add row: vea la apariencia de la barra de estado basada en el controlador y configúrela en YES
fuente
If you call this method within an animation block, the changes are animated along with the rest of the animation block.Xcode 10 o posterior
Probado en Swift 5
No se requiere código, solo siga los pasos a continuación.
No olvide los cambios de info.plist
Ejecute su proyecto y verifíquelo.
Mi proyecto en swift 5 y Xcode 10.2 y 11.0
fuente
Debe agregar la siguiente clave en su archivo Info.plist:
View controller-based status bar appearancecon valor booleano establecido enNOEn su clase appdelegate, en
didFinishLaunchingWithOptionsmétodo antes de regresar.cambio
backgroundColorystatusBarStylesegún requerimiento.fuente
También puedes hacer esto en storyboard
Tendrá que hacer esto para cada controlador de navegación que tenga. Sin embargo, cualquier vista bajo ese controlador de navegación cambiará el estilo / color de todas las barras de estado de la vista al que acaba de seleccionar. Encuentro esta opción mejor porque puede ver sus resultados al instante y no tiene que agregar líneas de código adicionales en cada controlador de vista.
(Hecho con Xcode 8.3.3 en un proyecto todo Swift)
fuente
View controller-based status bar appearance = NOy tener que usar solo un estilo claro u oscuro en toda la aplicación. Es una pena que esta forma "sin código" funcione solo en el controlador de navegación, Apple debería considerar agregar otro campo para configurar esta opción dentro de cualquier instancia del controlador de vista.Para las personas que buscan cambiar la barra de estado para todos los controladores de vista en: iOS 11, la solución Swfit 4/5 es bastante fácil.
1) Info.plist add:
2) Lado izquierdo del proyecto XCode slect> Objetivos > Seleccione su proyecto> En general> Información de implementación> Seleccionar estilo de barra de estado: claro
Si desea cambiar la barra de estado solo para un controlador de vista , en viewDidLoad agregue:
2.1 ) Lista de información
2.2 )
Objective-C (o reaccionar nativo) cambiando de delegado de aplicaciones:
1) Info.plist add:
2) AppDelegate -> didFinishLaunchingWithOptions
Cambiar la barra de estado no funciona al intentar hacer push (controladores de navegación), solo al presentar modalmente los controladores de vista.
fuente
El primer paso debe agregar una fila con clave:
View controller-based status bar appearancey valorNOalInfo.plistarchivo. Después de eso, agregue 2 funciones en su controlador para especificar solo que ese controlador tendrá efecto:fuente
Swift 3
En Info.plist agregue una fila llamada "Ver la apariencia de la barra de estado basada en el controlador" y establezca su valor en
No.fuente
Parece que hay un pequeño problema sobre el color del texto de la barra de estado cuando se trata de barras de navegación.
Si desea establecer la apariencia de la barra de estado basada en el controlador Ver entrada .plist
YES, a veces no funcionará cuando tenga una barra de navegación de color.Por ejemplo:
y
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}El código anterior no funcionará incluso si ha configurado lo siguiente en AppDelegate:
UIApplication.shared.statusBarStyle = .lightContentPara aquellos que todavía luchan, aparentemente juzga de alguna manera si la barra de estado debe ser clara u oscura según los estilos en la barra de navegación. Entonces, logré arreglar esto agregando la siguiente línea en viewWillAppear:
nav?.barStyle = UIBarStyle.blackCuando el estilo de la barra es negro, escucha su variable anulada. Espero que esto ayude a alguien :)
fuente
Para agregar a la gran respuesta por @Krunal https://stackoverflow.com/a/49552326/4697535
En caso de que esté utilizando a
UINavigationController, elpreferredStatusBarStyleno tendrá ningún efecto en elUIViewController.Xcode 10 y Swift 4.
Establecer una costumbre
UINavigationControllerEjemplo:
Use una extensión para una solución de nivel de aplicación:
fuente
Xcode 8.3.1, Swift 3.1
Cree una nueva entrada en info.plist "Ver la apariencia de la barra de estado basada en el controlador" configúrela en "NO".
Abra AppDelegate.swift y agregue estas líneas en el método "didFinishLaunchingWithOptions":
application.statusBarStyle = .lightContent
fuente
Swift 4+
para el texto blanco de la barra de estado:
fuente
Aquí están las instrucciones / instrucciones de Apple sobre el cambio de estilo de la barra de estado.
Si desea establecer el estilo barra de estado, nivel de aplicación a continuación, establece
UIViewControllerBasedStatusBarAppearancequeNOen su.plistarchivo. Y en suappdelegate>didFinishLaunchingWithOptionsadd following ine (programáticamente puede hacerlo desde el delegado de la aplicación).C objetivo
Rápido
si desea establecer el estilo de la barra de estado, en el nivel de vista del controlador, siga estos pasos:
UIViewControllerBasedStatusBarAppearanceaYESen el.plistarchivo, si necesita establecer el estilo de la barra de estado solo en el nivel UIViewController.En la función viewDidLoad add -
setNeedsStatusBarAppearanceUpdateanule preferredStatusBarStyle en su controlador de vista.
C objetivo
Rápido
Establezca el valor de .plist según el nivel de configuración del estilo de la barra de estado.
fuente
Swift 4.0 Utilice este código en "didFinishLaunchingWithOptions launchOptions:" clase Appdelegate
fuente
iOS 11.2
fuente
Esto funciono para mi
Establezca la
View controller-based status barapariencia en NO en plist y luego enUIViewControllerviewDidAppearacaba de agregar la siguiente líneafuente
rápido 3
si Ver la apariencia de la barra de estado basada en el controlador = SÍ en Info.plist
luego use esta extensión para todos los NavigationController
si no hay UINavigationController y solo tiene UIViewController, use el código A continuación:
fuente
Swift 5
Para agregar más detalles para la respuesta de PRAVEEN en https://stackoverflow.com/a/40066798/2082851 , me gustaría proporcionar mi implementación. Admite la flexibilidad para personalizar la barra de estado de cada controlador.
En general, crearemos uno
BaseViewControllerque maneje lastatusBarStylepropiedad en todos los casos. Cuando cree un nuevo controlador, hágalo como una subclase de este controlador base.Siempre que desee cambiar la apariencia del estado, solo necesita actualizar esta propiedad. El estilo de la barra de estado se actualizará inmediatamente.
Implementación
Manifestación
2)
UINavigationControllerPara
UINavigationController, es un caso especial, que puede seguir cualquiera de las soluciones:Solución A: anulación con envío de mensaje
Dado que UINavigationController es
NSObjecty hereda deObjectiveC, sus métodos sonmessage dispatchy puede anularlos.Solución B: crear
UINavigationControllersubclaseSi ya tiene una costumbre
UINavigationController(que generalmente necesita controlar más requisitos), esta es la mejor solución para usted.fuente
Puede usar una propiedad bool llamada "shouldStatusBarDark" para alternar el color de la barra de estado. Y también puede actualizar su valor para cambiar el color de la barra de estado cuando se desplaza.
fuente
La mayoría de estas respuestas son repetitivas, pero ninguna de ellas aborda la pantalla de inicio cuando uso un fondo oscuro.
Resolví esto con lo siguiente en mi
info.plistque produjo una barra de estado de estilo claro.fuente
Si está recibiendo la advertencia: Setter de 'statusBarStyle' fue desaprobado en iOS 9.0: Use - [UIViewController preferredStatusBarStyle] , luego para configurar la barra de estado en claro u oscuro use el siguiente código:
Esto no hará que su navBar cambie, simplemente indica el estilo y, por lo tanto, cambia la barra de estado en consecuencia.
NÓTESE BIEN. Debe asegurarse de configurar su info.plist.
fuente
Si está utilizando una presentación modal, debe configurar:
fuente
En iOS 13, puede usar la
.darkContentUIStatusBarStylepropiedad para mostrar la barra de estado oscurafuente
Si aún no puede cambiar la base de estilo de la barra de estado en el método
Puede intentar usar este método:
fuente
Para el objetivo C simplemente agregue esta línea en su aplicación didFinishLaunch method
fuente
usando WebkitView
Swift 9.3 iOS 11.3
fuente