Ú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.info
prá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 appearance
y 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: default
que es texto negro sobre fondo blanco o lightContent
texto blanco sobre fondo negro.
Para configurar uno de estos ( una configuración para todas las pantallas ):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
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 appearance
a 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 UIViewController
instancia que necesita:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
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:
- Al inicializar la pantalla, cuando se está preparando la IU.
- Al llamar
setNeedsStatusBarAppearanceUpdate()
en el código.
En este último caso, puede manipular la apariencia de la barra de estado con el siguiente código:
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
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:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = UIColor.blue
}
return true
}
¿Por qué hackear? Si necesita un color de barra de estado que no sea blanco o negro, use una API no documentada. Obtiene el statusBar
objeto usando KVC y establece su color de fondo. El objeto que se obtiene de esta manera es UIStatusBar
, que se deriva UIView
y, por lo tanto, naturalmente es compatible con la backgroundColor
propiedad. 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 el UINavigationBar
enfoque, 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.
extension UIViewController {
func setStatusBarStyle(_ style: UIStatusBarStyle) {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
}
}
}