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?
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
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
}
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
afalse
. - En la primera función de
AppDelegate.swift
, que contienedidFinishLaunchingWithOptions
, establezca el color que desee.
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
-
Actualización de Swift 3 *
UIApplication.compartir.statusBarStyle = .lightContent
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)
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()
}
}
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
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()
}
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.
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
.
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.
Stars
View Controller es un CPBaseNavigationController
, y CPBaseNavigationController
es una subclase de UINavigationController
.
Trato de hacer los siguientes setps:
-
En
AppDelegate.swift
funcdidFinishLaunchingWithOptions
, añádase//change status bar color UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent
Pero sin efecto.
En StoryBoard,encuentre el
Base Tab BarController
(imagen de arriba).seleccioneAttributes Inspector
, cambie laSattus Bar
atributo aLight Content
. tan malo,sin efecto.
-
La última vez it.In mi controlador de navegación personalizado
CPBaseNavigationController
, agregar funcpreferredStatusBarStyle
override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent }
Funciona bien!
Además, statusBarStyle
obsoleto en 9.0,puedes usar -[UIViewController preferredStatusBarStyle]
.
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
}
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)
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
}
}
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)
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
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
}
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,
- 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.
- 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 :)
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:
- Cambie la apariencia de la barra de estado basada en el controlador de vista en su
info.plist
a SÍ. - Ahora cualquier controlador de vista de pantalla completa puede cambie el estilo de la barra de estado sobreescribiendo
preferredStatusBarStyle
. - Especifico pantalla completa porque esto no funcionará para controladores de vista modal (no pantalla completa), no sin configurar
modalPresentationCapturesStatusBarAppearance
a Sí, eso es. -
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
childViewControllerForStatusBarStyle
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 }
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
}
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.
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.
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!
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
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 }
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