UIStatusBarStyle no funciona en Swift

85

Estoy tratando de cambiar el color de la barra de estado en mi aplicación Swift a blanco, pero estoy golpeando una pared de ladrillos. Tengo 3 ViewControllers que están integrados en un NavigationController (¿podría ser ese el problema? Ya intenté colocar el código en la clase NavigationController). Probé los dos siguientes fragmentos de código en didFinishLaunchingWithOptions de mi AppDelegate Archivo .swift pero ninguno funcionó.

application.statusBarStyle = .LightContent

y

UIApplication.sharedApplication().statusBarStyle = .LightContent

Todo lo que los Docs tienen que decir al respecto es que UIBarButtonStyle es un Int y me dio este fragmento de enumeración que no me ayudó en absoluto con la implementación.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

¿Qué me estoy perdiendo?

davidrayowens
fuente

Respuestas:

145

Tienes dos opciones.

Si desea continuar configurando manualmente el estilo de la barra de estado, continúe haciendo lo que está haciendo, pero deberá agregar la siguiente clave a su archivo info.plist con un valor de NO.

Ver la apariencia de la barra de estado basada en el controlador

O, si desea continuar usando la apariencia de la barra de estado basada en el controlador de vista, en lugar de establecer el statusBarStyle de la aplicación, anule la preferredStatusBarStylepropiedad en cada controlador de vista para el que desea especificar un estilo de barra de estado.

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Mick MacCallum
fuente
Probé este código ... pero solo aparece la barra de estado blanca en la primera pantalla ... No obtengo la barra de estado para el resto de las pantallas :( .. ¿alguna ayuda?
Rahul
7
Debe establecer la configuración "Ver apariencia de la barra de estado basada en el controlador" en su plist en SÍ.
StackUnderflow
1
Eso es solo si desea utilizar una apariencia de barra de estado basada en el controlador de vista.
Sam Holmes
4
en iOS 10 (Swift 3.0) ya no es un método sino una propiedad. Ver: stackoverflow.com/questions/38862208/…
stevo.mit
solo para una pantalla
Oubaida AlQuraan
143

Swift 3.0

en AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

en AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO
Maselko
fuente
1
Esta es la respuesta perfecta :)
Jay Mayu
1
Respuesta perfecta. Corto y dulce.
Mehul
3
lo siento, esta podría ser la respuesta más simple, pero definitivamente no es la MEJOR: porque simplemente establece este estilo para todos y cualquier viewControllers en la aplicación. El comportamiento se ha introducido para permitir un control más preciso y aplicar diferentes configuraciones basadas en diferentes controladores de vista (por ejemplo, mezclar contenido claro y oscuro).
auco
Es extraño, no es lo que dicen los documentos de Apple, pero funciona. Probé un montón de otras formas, incluida una barra de estado basada en UIViewController, ninguna de ellas funcionó.
n13
33

Tienes que configurar:

navigationController.navigationBar.barStyle = .black

y el texto aparecerá en blanco

Nico S.
fuente
1
¡Gracias! No había nada ayudó incluso esta anulación func preferredStatusBarStyle () -> UIStatusBarStyle {return} UIStatusBarStyle.LightContent esto realmente ayuda a: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana
¡Gracias! Salvaste mi día. Sin embargo, BlackTranslucent está en desuso. Por lo tanto, utilicé navigationController.navigationBar.barStyle = .Black
hsusmita
Funciona perfectamente con override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Solo tienes que escribir esta línea viewDidLoadpara que funcione bien. Asegúrate de conservar View controller-based status bar appearance = YESesta solución.
Bhavin_m
parece una exageración ... sólo probado y ha trabajado como esta en el archivo Info.plist: estilo de la barra de estado 1. -> UIStatusBarStyleLightContent 2. Vista basado en un controlador aspecto de la barra de estado -> NO
raistlin
21

Para iOS9.xy Xcode7, simplemente ponga esto dentro AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

Esto cambiará automáticamente el estilo de la barra de estado a .Lightcontenttodos los controladores de vista dentro de un UINavigationController.

(¡Además, elimine View controller-based status bar appearancede Info.plist para suprimir las advertencias que probablemente también esté viendo!)

Biodave
fuente
gracias. Parece haber un error grave en iOS9. Esta era la única forma en que podía convertir la barra de estado en el VC inicial en blanco. Probé todo. Presentaré un radar.
1b0t
favoriteStatusBarStyle devuelve UIStatusBarStyleDefault pero no actualiza el contenido de luz a contenido oscuro para un controlador de vista específico. Después de self.navigationController.navigationBar.barStyle = UIBarStyleDefault; in viewWillAppear funcionó para mí. Espero que este comentario ayude a otros.
Pandey_Laxman
Tenga en cuenta que UIStatusBarStyle se ha cambiado a ".black" (B minúscula) en Swift 3
brycejl
16

En Swift 3, el estilo de la barra de estado ha cambiado a una propiedad calculada en UIViewController que puede anular de esta manera:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 
Eric Welander
fuente
13

En iOS 9, el siguiente (setStatusBarStyle) está en desuso y recibirá una advertencia si sigue ese camino.

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

Si desea que se cambien todas las barras de estado de una sola vez, intente agregar lo siguiente a su Info.plist. Esto también hará que la barra de estado de la pantalla de inicio sea blanca. Mientras que el código anterior no lo hará.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
GuiSoySalsa
fuente
El enfoque .plist es correcto, pero setStatusBarStyle () no es necesario. 'setStatusBarStyle (_: animated :)' quedó obsoleto en iOS 9.0: Use - [UIViewController favoriteStatusBarStyle]
Bill Chan
@BillChan gracias por comentar, pero lea la ganancia de respuesta. Ya expliqué que 'setStatusBarStyle' estaba en desuso. Debería usar favoriteStatusBarStyle si desea cambiar uno u otro viewControllers. El enfoque plist es para quien quiere que se cambien todos los viewControllers en una sola toma. No hay nada correcto o incorrecto aquí. Solo es cuestión de lo que necesitas lograr.
GuiSoySauce
1
UIStatusBarStyle = UIStatusBarStyleLightContent (en .plist) ayudó a iniciar mi aplicación con el texto de la barra de estado en blanco ... ¡Gracias!
Chris Allinson
10

Para mí, todo lo anterior no funcionará hasta que agregue:

self.navigationController?.navigationBar.barStyle = .black;

entonces:

  1. Establecer UIViewControllerBasedStatusBarAppearancea YESde.plist
  2. En viewDidLoadllamadaself.setNeedsStatusBarAppearanceUpdate();
  3. Anular preferidoStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. En el método anulado, configuro también el navigationBar.barStylefinal
    para contenido ligero :
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    y para contenido negro , uso predeterminado

La fuente de aquí y aquí .

y si esto no funciona, puede intentar agregar un UINavigationController extension:

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }

        return .default
    }
}
Constantin Saulenco
fuente
1
No hay comentarios sobre el estilo de la barra de navegación ... pero en Swift 3, Xcode 8, esta fue la única solución que funcionó para mí.
Despotovic
El único inconveniente que he notado es que con todos esos pasos cambia pero sin animación
Lukasz 'Severiaan' Grela
6

Es extraño, usar Swift 3.1 y XC8.2.1, pero todo lo anterior no funcionó.

Lo que hice, es solo

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return .lightContent
        }
    }
}

Sin Plist, sin otras cosas. HTH

Señor iPhonius
fuente
También funciona para Swift 4.2.
zeeshan
2

En Swift 3.0, puede anular un captador en ViewController para la apariencia de la barra de estado basada en el controlador de View:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}
Denis Kreshikhin
fuente
1

No edite su Info.plist. Agregue esto a su ViewController.swift:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Sev
fuente
1

Paso 1. Agregar a info.plist View controller-based status bar appearance -> NO

Paso 2. Agregue código en el método donde necesita cambiar el color de la barra de estado:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

Línea clave de código: setNeedsStatusBarAppearanceUpdate()

Igor
fuente