Cambiar el color de la barra de estado para ViewControllers específicos utilizando Swift en iOS8

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

Usar el código anterior en cualquier ViewController para establecer el color de la barra de estado en blanco para un controlador de vista específico no funciona en iOS8 para mí . ¿Alguna sugerencia? Al utilizar el método UIApplication.sharedApplication, el color cambia después de los cambios necesarios en Info.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 ViewControllers necesarios y específicos ?

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

Primer paso:

Abra su info.plist e inserte una nueva clave llamada ” Ver apariencia de la barra de estado basada en el controlador ” a NO

Segundo paso (solo una explicación, no es necesario implementar esto):

Normalmente ponemos el siguiente código en el método de la aplicación (_: didFinishLaunchingWithOptions 🙂 de AppDelegate,

Swift 2

 UIApplication.sharedApplication().statusBarStyle = .LightContent 

Swift 3

 UIApplication.shared.statusBarStyle = .lightContent 

pero eso afecta al statusBarStyle de todos los ViewControllers.

Entonces, cómo hacer que esto funcione para ViewControllers 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 

Además, implemente el método viewWillDisappear() para ese viewController específico y coloque 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 viewcontroller específico y luego lo cambiará a los valores default cuando desaparece el viewcontroller específico. La no implementación de viewWillDisappear() cambiará el statusBarStyle permanentemente al nuevo valor definido de UIStatusBarStyle.LightContent

(A partir del 23 de mayo de 2018)

Swift 3 y Swift 4

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent } override var preferredStatusBarStyle : UIStatusBarStyle { return .lightContent } 

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

  • Abra su info.plist y establezca UIViewControllerBasedStatusBarAppearance en false .
  • En la primera función en AppDelegate.swift , que contiene didFinishLaunchingWithOptions , establezca el color que desea.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Actualización de Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent

En su Info.plist necesita definir Ver la apariencia de la barra de estado basada en el controlador a cualquier valor.

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

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

 UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) 
 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() } } 

Hay mil millones de respuestas aquí, así que pensé por qué no agregar otra en forma de 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 } } } 

Implementación:

 UIApplication.statusBarBackgroundColor = .blue 

SWIFT 2

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

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

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 el controlador de vista específico.

Implemente preferredStatusBarStyle como mencionó y llame a self.setNeedsStatusBarAppearanceUpdate() en ViewDidLoad y también en Info.plist establezca UIViewControllerBasedStatusBarAppearance en YES (es YES de manera predeterminada)

No está claro por qué no funciona. Necesito verificar el código. Otra sugerencia es ir con el código de trabajo en viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent y cambiar esto a la predeterminada cuando vea get desapareció viewWillDisappear .

En mi situación, utilizo el guión gráfico para organizar mis controles de vista. Quiero cambiar todo el estilo de la barra de estado.

Puedes ver en la imagen a continuación.

enter image description here

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

Intento hacer los siguientes setps:

  1. En AppDelegate.swift func didFinishLaunchingWithOptions , agregue

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

    pero no tiene efecto.

  2. En StoryBoard, encuentre el Base Tab BarController (imagen en la parte superior). Seleccione Attributes Inspector , cambie el Sattus Bar a Light Content Tan mal, sin efecto.

enter image description here

  1. La última vez que lo entiendo. En mi controlador de navegación personalizado CPBaseNavigationController , agrego func preferredStatusBarStyle

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

    ¡Funciona bien!

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

para veloz 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 } 

Funciona para aplicaciones basadas en 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) 

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 } } 

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

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

inserta esto:

 UINavigationBar.appearance().barStyle = .black UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0) 

Establecí el color específico (en formato RGB) usando el código siguiente 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 necesita agregar la siguiente clave en el archivo Info.plist :

Ver 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

Puedo sugerirte una forma más simple,

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

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

  1. Implemente preferredStatusBarStyle devolviendo su tipo preferido.

Me funcionó en iOS 10.1.

C objective

 [self setNeedsStatusBarAppearanceUpdate]; -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } 

Rápido

 setNeedsStatusBarAppearanceUpdate() var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

Me sorprende que nadie lo haya señalado. De todos modos, disfruta 🙂

Tuve algunos problemas con este. Realmente no me sentí bien con el cambio global del color de la barra de estado en la vista apareció y luego cambiarlo a 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 View en su info.plist a YES.
  2. Ahora, cualquier controlador de vista de pantalla completa puede cambiar el estilo de la barra de estado anulando preferredStatusBarStyle .
  3. Especifico la pantalla completa porque esto no funcionará para los controladores de vista modal (no de pantalla completa), no sin configurar modal​Presentation​Captures​Status​Bar​Appearance es Sí que sí lo es.
  4. Además, si tiene controles de vista incrustados, como en un controlador de navegación, por ejemplo, le pedirá al controlador de vista superior que muestre el estilo de la barra de estado. Reemplazar child​View​Controller​For​Status​Bar​Style y aprobar el controlador de vista incrustado debe funcionar, pero no funcionó. Así que acabo de devolver la barra de estado preferida de los controles de vista incrustados como el estilo preferido de la barra de estado. Algo como esto:

     override var preferredStatusBarStyle: UIStatusBarStyle { if let topViewController = viewControllers.last { return topViewController.preferredStatusBarStyle } return .default } 

Swift 4 Para ViewController específico sin navigationViewController embedded, simplemente agréguelo a su archivo ViewController.

 override var preferredStatusBarStyle : UIStatusBarStyle { return .lightContent } 

Actualización de Swift 3.0

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UIApplication.shared.statusBarStyle = .lightContent return true } 

Haga clic en el grupo Archivos auxiliares (arriba a la izquierda – nombre de su proyecto). Navega a Info. Haga clic en + en algún lugar entre las listas, como debajo del nombre del paquete. Y agregue “Ver la apariencia de la barra de estado basada en el controlador” y configúrelo en NO. A continuación, abra AppDelegate.swift y modifique de esta manera:

 func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) return true } 

Eso es.

Literalmente me metí en este mismo tema. Me llevó más de 4 horas averiguarlo. Intenté todas las respuestas dadas aquí y lo mejor que pude hacer fue poner el título en blanco en la barra de estado. Pero los otros bits, como la barra de la 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 cambiar los colores. Para mí, era dependencia de “ChameleonFramework”. Así que le aconsejo que compruebe las dependencias que ha instalado desde CocoaPods eliminando las más recientes si ha aplicado todas las soluciones y no está trabajando para usted.

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

Swift 4.0 Utilice este código en “didFinishLaunchingWithOptions launchOptions:” Clase Appdelegate

 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 } 

Swift 3

En su archivo AppDelegate dentro del método de func application

 let statusBar: UIView = application.value(forKey: "statusBar") as! UIView statusBar.backgroundColor = .red