Cambiar el color de la barra de estado para ViewController específicos usando Swift en iOS8


override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

Usando el código anterior en cualquier ViewController para establecer el color de la barra de estado en blanco para un viewcontroller específico no funciona en iOS8 para mí. Alguna sugerencia? Usando la aplicación UIApplication.Método sharedApplication, el color cambia después de los cambios necesarios en la información.plist para toda la aplicación.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

¿Cómo puedo hacer cambios en el color de la barra de estado para algunos requeridos y controladores de vista específicos?

Author: Anuj, 2014-11-16

24 answers

Después de leer todas las sugerencias, y probar algunas cosas, podría hacer que esto funcione para viewcontroller específicos usando los siguientes pasos:

Primer Paso:

Abre tu información.plist e inserte una nueva clave llamada " View controller-based status bar appearance " para NO

Segundo paso (Solo una explicación, sin necesidad de implementar esto):

Normalmente ponemos el siguiente código en el aplicación(_:didFinishLaunchingWithOptions:) método del AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Pero eso afecta al statusBarStyle de todos los controladores ViewController.

Entonces, cómo hacer que esto funcione para ViewController específicos-Paso final:

Abra el archivo viewcontroller donde desea cambiar el statusBarStyle y coloque el siguiente código en viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

También, implementa el método viewWillDisappear() para ese ViewController específico y coloca las siguientes líneas de código,

Swift 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

Swift 3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

Este paso primero cambiará el statusBarStyle para el controlador viewcontroller específico y luego lo cambiará de nuevo a default cuando el controlador viewcontroller específico desaparezca. Ni la implementación del {[9] } cambiará el statusBarStyle permanentemente al nuevo valor definido de UIStatusBarStyle.LightContent

 317
Author: Anuj,
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-03-17 12:22:45

(A partir de mayo 23, 2018)

Swift 3 y Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.shared.statusBarStyle = .lightContent
}
override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
 48
Author: BennyTheNerd,
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
2018-05-24 19:20:10

Seguí este tutorial y funcionó para mí. Sin embargo, no estoy seguro de si hay alguna advertencia.

Https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • Abre tu información.plist y set UIViewControllerBasedStatusBarAppearance a false.
  • En la primera función de AppDelegate.swift, que contiene didFinishLaunchingWithOptions, establezca el color que desee.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Actualización de Swift 3 *

    UIApplication.compartir.statusBarStyle = .lightContent

 24
Author: chris_s,
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-11 12:01:40

En su Información.plist necesita definir la apariencia de la barra de estado basada en el controlador de vista a cualquier valor.

Si lo define SÍ, entonces debería anular la función preferredStatusBarStyle en cada controlador de vista.

Si lo define NO, puede establecer el estilo en AppDelegate utilizando

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
 15
Author: Nikita Khandelwal,
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
2015-07-23 09:00:03
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}
 12
Author: A.G,
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-11 08:38:03

Hay mil millones de respuestas aquí, así que pensé por qué no agregar otra en forma de una extensión (con la ayuda de @Cœur)

Swift 3

Extensión:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

Aplicación:

UIApplication.statusBarBackgroundColor = .blue
 12
Author: John R Perry,
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-03-13 22:49:11

SWIFT 2

Pude cambiar con éxito la apariencia del fondo de la barra de estado agregando lo siguiente en mi viewWillAppear:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
 11
Author: A.J. Hernandez,
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-07-26 04:23:31

Swift 3

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
  statusBar.backgroundColor = UIColor.black
} 

Esa es la solución para establecer el color de fondo de la barra de estado para un controlador de vista específico.

 11
Author: Chris Tsitsaris,
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-11-24 10:09:42

Implementa preferredStatusBarStyle como mencionaste y llama self.setNeedsStatusBarAppearanceUpdate() en ViewDidLoad y también en Info.plist establece UIViewControllerBasedStatusBarAppearance a YES (Es YES por defecto)

No está claro por qué no está funcionando.Necesito comprobar el código.Otra sugerencia es ir con el código de trabajo en viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent y cambie esto a predeterminado cuando vea get disappeared viewWillDisappear.

 7
Author: codester,
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-11-17 17:00:13

En mi situación,uso storyboard para organizar mis controladores de vista.Quiero cambiar todo el estilo de la barra de estado.

Se puede ver en la imagen de abajo.

introduzca la descripción de la imagen aquí

Stars View Controller es un CPBaseNavigationController, y CPBaseNavigationController es una subclase de UINavigationController.

Trato de hacer los siguientes setps:

  1. En AppDelegate.swift func didFinishLaunchingWithOptions, añádase

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    Pero sin efecto.

  2. En StoryBoard,encuentre el Base Tab BarController (imagen de arriba).seleccione Attributes Inspector, cambie la Sattus Bar atributo a Light Content. tan malo,sin efecto.

introduzca la descripción de la imagen aquí

  1. La última vez it.In mi controlador de navegación personalizado CPBaseNavigationController, agregar func preferredStatusBarStyle

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

    Funciona bien!

Además, statusBarStyle obsoleto en 9.0,puedes usar -[UIViewController preferredStatusBarStyle].

 7
Author: wenghengcong,
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-04-10 03:09:07

Para swift 3

.plist

View controller-based status bar appearance = NO

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }
 7
Author: Giang,
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-05 04:06:12

Funciona para la Aplicación Basada en la Navegación

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
 6
Author: Jio,
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-04-18 07:42:56

Swift 3

//
//  LoginController.swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
 6
Author: theCrab,
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-03-12 15:33:52

Todo es mucho más fácil en Swift 3.0 Xcode 8

Usando el siguiente código en el archivo Delegado de la aplicación, después de

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

Insértese esto:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
 5
Author: Anton Russia,
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-07 00:18:40

Había establecido un color específico (en formato RGB) utilizando el siguiente código en el archivo App Delegate:

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

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

También debe agregar la siguiente clave en el archivo Info.plist:

Vista de la apariencia de la barra de estado basada en el controlador con el valor booleano establecido en NO

Captura de pantalla 1

Captura de pantalla 2

 3
Author: Jayprakash Dubey,
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-08-23 09:41:41

Swift 4 Para ViewController específico sin navigationViewController incrustado simplemente agregue esto a su archivo ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
 3
Author: Surjit Singh,
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
2018-02-20 05:27:26

Puedo sugerirte una manera más simple,

  1. Simplemente llame a setNeedsStatusBarAppearanceUpdate en viewDidLoad como dice Apple docs,

Llame a este método si cambian los atributos de la barra de estado del controlador de vista, como el estado oculto/no oculto o el estilo. Si llama a este método dentro de un bloque de animación, los cambios se animan junto con el resto del bloque de animación.

  1. Implementar preferredStatusBarStyle devolver su tipo preferido.

Funcionó para mí en iOS 10.1.

Objetivo C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Swift

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Me sorprende que nadie señalara esto. De todos modos disfrutar :)

 2
Author: Bhaumik Desai,
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-11-17 15:31:47

Tuve algunos problemas con este. Realmente no me sentí bien al cambiar globalmente el color de la barra de estado en la vista y luego cambiarlo de nuevo en la vista desapareció como la respuesta aceptada. Lo creas o no, puedes hacer que esto funcione anulando preferredStatusBarStyle en tu controlador de vista deseado. Después de mucho tiempo esto es lo que hice para que funcione:

  1. Cambie la apariencia de la barra de estado basada en el controlador de vista en su info.plist a SÍ.
  2. Ahora cualquier controlador de vista de pantalla completa puede cambie el estilo de la barra de estado sobreescribiendo preferredStatusBarStyle.
  3. Especifico pantalla completa porque esto no funcionará para controladores de vista modal (no pantalla completa), no sin configurar modal​Presentation​Captures​Status​Bar​Appearance a Sí, eso es.
  4. También si tiene controladores de vista incrustados, como en un controlador de navegación, por ejemplo, le pedirá al controlador de vista superior el estilo de barra de estado. Anular child​View​Controller​For​Status​Bar​Style y pasar el controlador de vista incrustado se supone que funciona, pero no lo hizo para mí. Así que acabo de devolver el embebido ver la barra de estado preferida de los controladores como el estilo de barra de estado preferido. Algo como esto:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
    
 2
Author: John C.,
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-03-15 02:01:29

Actualización de Swift 3.0

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
 1
Author: Jaseibert,
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-01-05 19:17:25

Haga clic en el grupo Archivos de soporte(lado izquierdo superior - nombre de su proyecto). Vaya a Información. Haga clic en + en algún lugar entre las listas, como debajo del nombre del paquete. Y agregue "Ver aparición de la barra de estado basada en el controlador" y establézcala en NO. A continuación, abra AppDelegate.rápido y modificar así:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

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

return true
}

Eso es todo.

 0
Author: Goran Jakovljevic,
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
2015-01-09 08:23:27

Literalmente me metí en este mismo tema. Me llevó más de 4 horas averiguarlo. Probé todas las respuestas dadas aquí y lo mejor que conseguí fue conseguir el rumbo a la Barra de estado blanco. Pero los otros bits, como la barra de batería y otros seguían siendo negros sin importar lo que hiciera: con respecto a la aplicación de todas las soluciones proporcionadas en esta pregunta. Así que decidí volver sobre mis pasos y me enteré de que había descargado una dependencia de CocoaPod que estaba alterando las funcionalidades normales de Xcode y los códigos para cambia de color. Para mí, era "ChameleonFramework" dependencia. Así que le aconsejo que revise sus dependencias que ha instalado desde CocoaPods eliminando las más recientes si ha aplicado todas las soluciones y no está funcionando para usted.

 0
Author: Martin Q,
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-04-10 02:20:20

Lo que funcionó conmigo, en el Storyboard, vaya al Controlador de navegación, seleccione la barra de navegación, haga clic en el Inspector de atributos, luego cambie el estilo de predeterminado a negro. ¡Eso es!

 0
Author: Amr,
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-11-14 22:52:12

Swift 3

En su archivo AppDelegate dentro del método func application

let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red
 -2
Author: Mohammed Tawfik,
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-09-25 07:52:03

Swift 4.0 Utilice este código en" didFinishLaunchingWithOptions launchOptions: "Appdelegate class

UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }
 -2
Author: Karthickkck,
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-11-03 03:13:05