ios - programación - swift para windows
Cómo configurar el estilo de la barra de estado en Swift 3 (28)
Ú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 emplearlo).
Todavía se refiere a su información para comprender mejor el razonamiento detrás de la bandera
Plist.info
y la práctica de 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
, que es 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 la apariencia voluntariamente.
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 establece individualmente si inserta esta implementación en cada instancia de
UIViewController
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 a
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()
}
Luego, cada vez que llame a
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, utilice una API no documentada.
statusBar
objeto
statusBar
usando KVC y establece su color de fondo.
El objeto que obtiene de esta manera es
UIStatusBar
, que se deriva de
UIView
y, por lo tanto, naturalmente es compatible
backgroundColor
propiedad
backgroundColor
.
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 enfoque
UINavigationBar
, que permite personalizar la apariencia de la barra de estado + barra de navegación por completo).
Es muy posible que su aplicación sea rechazada.
Pero tal vez tengas suerte.
Y si lo es, en ciertas circunstancias complejas (como la jerarquía de controladores de vista y navegación 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")
}
}
}
Estoy usando Xcode 8.0 beta 4.
En la versión anterior, UIViewController tenía un método para establecer el estilo de la barra de estado
public func preferredStatusBarStyle() -> UIStatusBarStyle
Sin embargo, descubrí que cambió a "Obtener SOLO varaiable" en Swift 3.
public var preferredStatusBarStyle: UIStatusBarStyle { get }
¿Cómo puedo proporcionar el estilo para usar en mi UIViewController?
Xcode 10 o posterior
No se requiere código, solo siga los pasos a continuación.
Si desea cambiar la barra de estado en toda la aplicación.
- Seleccione Proyecto del Navegador de proyectos (panel lateral izquierdo).
- Seleccione un objetivo.
- Seleccione la pestaña General.
- Encuentra información de implementación.
- Cambie el estilo de la barra de estado a Claro (para fondo oscuro "Claro" , Fondo claro "Predeterminado" )
No olvide los cambios de info.plist
- Seleccione la pestaña Información
- Agregue esta clave en su archivo plist "Ver la apariencia de la barra de estado basada en el controlador" = NO
Ejecute su proyecto y verifíquelo.
Mi proyecto en swift 5 y Xcode 10.2
[ACTUALIZADO] Para Xcode 10+ y Swift 4.2+
Este es el método preferido para iOS 7 y superior
En la lista
Info.plist
su aplicación, configure
View controller-based status bar appearance
en
YES
.
Anule
preferredStatusBarStyle
(
documentos de Apple
) en cada uno de sus controladores de vista.
Por ejemplo:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Si ha
preferredStatusBarStyle
que
preferredStatusBarStyle
devuelva un estilo de barra de estado preferido diferente basado en algo que cambia dentro de su controlador de vista (por ejemplo, si la posición de desplazamiento o si una imagen mostrada es oscura), entonces querrá llamar a
setNeedsStatusBarAppearanceUpdate()
cuando ese estado cambios
iOS anterior a la versión 7, método obsoleto
Apple ha desaprobado esto , por lo que se eliminará en el futuro. Use el método anterior para que no tenga que volver a escribirlo cuando se lance la próxima versión de iOS.
Si su aplicación admitirá En la lista de información de su aplicación, establezca
View controller-based status bar appearance
en
NO
.
En
appDelegate.swift
, la función
didFinishLaunchingWithOptions
, agrega:
UIApplication.shared.statusBarStyle = .lightContent
Para el controlador de navegación
Si usa un controlador de navegación y desea que se use el estilo de barra de estado preferido de cada controlador de vista y configure
View controller-based status bar appearance
en
YES
en la lista de información de su aplicación
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
}
Aquí están las instrucciones / instrucciones de Apple sobre el cambio de estilo de la barra de estado.
Si desea establecer el estilo de la barra de estado, el nivel de aplicación, establezca
UIViewControllerBasedStatusBarAppearance
en
NO
en su archivo
.plist
.
Y en su
appdelegate
>
didFinishLaunchingWithOptions
agregue el siguiente ine (programáticamente puede hacerlo desde el delegado de la aplicación).
C objetivo
[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
Rápido
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent
return true
}
si desea establecer el estilo de la barra de estado, en el nivel de vista del controlador, siga estos pasos:
-
Establezca
UIViewControllerBasedStatusBarAppearance
enYES
en el archivo.plist
, si necesita establecer el estilo de la barra de estado solo en el nivel UIViewController. -
En la función viewDidLoad add -
setNeedsStatusBarAppearanceUpdate
-
anule preferredStatusBarStyle en su controlador de vista.
C objetivo
- (void)viewDidLoad
{
[super viewDidLoad];
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Rápido
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Establezca el valor de .plist según el nivel de configuración del estilo de la barra de estado.
Debe agregar la siguiente clave en su archivo Info.plist:
View controller-based status bar appearance
con un valor booleano establecido en
NO
En su clase appdelegate, en el método
didFinishLaunchingWithOptions
antes de regresar.
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = UIColor.red
}
UIApplication.shared.statusBarStyle = .lightContent
cambie
backgroundColor
y
statusBarStyle
según el requisito.
Esto funciono para mi
Establezca
View controller-based status bar
apariencia de la
View controller-based status bar
en
NO
en plist y luego en
UIViewController
viewDidAppear
acaba de agregar la siguiente línea
UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
La mayoría de estas respuestas son repetitivas, pero ninguna de ellas aborda la pantalla de inicio cuando uso un fondo oscuro.
info.plist
esto con lo siguiente en mi
info.plist
que produjo una barra de estado de estilo claro.
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Para agregar a la gran respuesta por @Krunal https://.com/a/49552326/4697535
En caso de que esté utilizando un
UINavigationController
, el
UINavigationController
no tendrá efecto en el
UIViewController
.
Xcode 10 y Swift 4.
Establecer un
UINavigationController
personalizado
Ejemplo:
class LightNavigationController: UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Use una extensión para una solución de nivel de aplicación:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
guard let index = tabBarController?.selectedIndex else { return .default }
switch index {
case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
default: return .default // set dark for tab 3
}
}
}
Para el objetivo C simplemente agregue esta línea en su aplicación didFinishLaunch method
UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Para las personas que buscan cambiar la barra de estado para todos los controladores de vista en: iOS 11, la solución Swfit 4/5 es bastante fácil.
1) Info.plist add:
Ver la apariencia de la barra de estado basada en el controlador -> NO
2) Lado izquierdo del proyecto XCode slect> Objetivos > Seleccione su proyecto> En general> Información de implementación> Seleccionar estilo de barra de estado: claro
Si desea cambiar la barra de estado solo para un controlador de vista , en viewDidLoad agregue:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Parece que hay un pequeño problema sobre el color del texto de la barra de estado cuando se trata de barras de navegación.
Si desea que la entrada .plist Vea la apariencia de la barra de estado basada en el controlador establecida en
YES
, a veces no funcionará cuando tenga una barra de navegación de color.
Por ejemplo:
override func viewWillAppear(_ animated: Bool) {
let nav = self.navigationController?.navigationBar
nav?.barTintColor = .red
nav?.tintColor = .white
nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
setNeedsStatusBarAppearanceUpdate()
}
y
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}
El código anterior no funcionará incluso si ha configurado lo siguiente en AppDelegate:
UIApplication.shared.statusBarStyle = .lightContent
Para aquellos que todavía están luchando, aparentemente juzga de alguna manera si la barra de estado debe ser clara u oscura según los estilos en la barra de navegación. Entonces, logré arreglar esto agregando la siguiente línea en viewWillAppear:
nav?.barStyle = UIBarStyle.black
Cuando el estilo de la barra es negro, escucha su variable anulada. Espero que esto ayude a alguien :)
Podría intentar anular el valor devuelto, en lugar de configurarlo. El método se declara como {get}, así que solo proporcione un getter:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Si configura esto condicionalmente, deberá llamar a
setNeedsStatusBarAppearanceUpdate()
para animar el cambio cuando esté listo
Primer paso que necesita agregar una fila con la clave:
View controller-based status bar appearance
y el valor
NO
al archivo
Info.plist
.
Después de eso, agregue 2 funciones en su controlador para especificar solo que ese controlador tendrá efecto:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = .lightContent
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = .default
}
Puede usar una propiedad bool llamada "shouldStatusBarDark" para alternar el color de la barra de estado. Y también puede actualizar su valor para cambiar el color de la barra de estado cuando se desplaza.
var shouldStatusBarDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return shouldStatusBarDark ? .default : .lightContent
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offSetY = scrollView.contentOffset.y
if offSetY > 50 {
UIView.animate(withDuration: 0.4, animations: {
self.navView.alpha = 1
self.shouldStatusBarDark = true
})
} else {
UIView.animate(withDuration: 0.4, animations: {
self.navView.alpha = 0
self.shouldStatusBarDark = false
})
}
}
Si desea cambiar el
statusBar
del
statusBar
a blanco, para todas las vistas contenidas en un
UINavigationController
, agregue esto dentro de
AppDelegate
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
Este código:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
no
funciona para
UIViewControllers
contenidos en un
UINavigationController
, porque el compilador busca el
statusBarStyle
del
UINavigationController
, no el
statusBarStyle
de los
ViewControllers
contenidos en él.
¡Espero que esto ayude a aquellos que no han tenido éxito con la respuesta aceptada!
Si desea cambiar el estilo de la barra de estado en cualquier momento después de que aparezca la vista, puede usar esto:
-
En el archivo info.list add row: vea la apariencia de la barra de estado basada en el controlador y configúrela en YES
var viewIsDark = Bool() func makeViewDark() { viewIsDark = true setNeedsStatusBarAppearanceUpdate() } func makeViewLight() { viewIsDark = false setNeedsStatusBarAppearanceUpdate() } override var preferredStatusBarStyle: UIStatusBarStyle { if viewIsDark { return .lightContent } else { return .default } }
Si está recibiendo la advertencia: Setter de ''statusBarStyle'' fue desaprobado en iOS 9.0: Use - [UIViewController preferredStatusBarStyle] , luego para configurar la barra de estado en claro u oscuro use el siguiente código:
//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent
//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default
Esto no hará que su navBar cambie, simplemente indica el estilo y, por lo tanto, cambia la barra de estado en consecuencia.
NÓTESE BIEN. Debe asegurarse de configurar su info.plist.
View controller-based status bar appearance to YES
Si está utilizando una presentación modal, debe configurar:
viewController.modalPresentationCapturesStatusBarAppearance = true
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
}
También puedes hacer esto en storyboard
- Cree una nueva entrada en info.plist "Ver la apariencia de la barra de estado basada en el controlador" configúrela en "SÍ".
- Vaya a su guión gráfico y luego seleccione el controlador de navegación que desea cambiar. Haga clic en la barra de navegación desde la sección de esquema del documento del Guión gráfico (panel izquierdo en el guión gráfico)
- Vaya al panel derecho y haga clic en la sección de atributos.
- En la sección Barra de navegación, verá estilo. Seleccione el estilo que desee (el valor predeterminado es para el negro y el negro para el blanco)
Tendrá que hacer esto para cada controlador de navegación que tenga. Sin embargo, cualquier vista bajo ese controlador de navegación cambiará el estilo / color de todas las barras de estado de la vista a la que acaba de seleccionar. Encuentro esta opción mejor porque puede ver sus resultados al instante y no tiene que agregar líneas de código adicionales en cada controlador de vista.
(Hecho con Xcode 8.3.3 en un proyecto todo Swift)
Xcode 8.3.1, Swift 3.1
-
Cree una nueva entrada en info.plist "Ver la apariencia de la barra de estado basada en el controlador" configúrela en "NO".
-
Abra AppDelegate.swift y agregue estas líneas en el método "didFinishLaunchingWithOptions":
application.statusBarStyle = .lightContent
usando WebkitView
Swift 9.3 iOS 11.3
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
@IBOutlet weak var webView: WKWebView!
var hideStatusBar = true
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsStatusBarAppearanceUpdate()
let myURL = URL(string: "https://www.apple.com/")
let myRequest = URLRequest(url: myURL!)
UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
webView.load(myRequest)
}
}
extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}
Swift 3
En Info.plist, agregue una fila llamada "Ver la apariencia de la barra de estado basada en el controlador" y establezca su valor en
No
class YourViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarStyle = .lightContent //or .default
setNeedsStatusBarAppearanceUpdate()
}
}
Swift 3
Para configurar la misma apariencia de la barra de navegación en su aplicación, puede hacerlo en AppDelegate.swift:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
setupNavigationBarAppearence()
return true
}
private func setupNavigationBarAppearence(){
let navigationBarAppearace = UINavigationBar.appearance()
navigationBarAppearace.isTranslucent = false
//nav bar color
navigationBarAppearace.barTintColor = UIColor.primaryColor()
//SETS navbar title string to white
navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
//Makes the batery icon an any other icon of the device to white.
navigationBarAppearace.barStyle = .black
}
Swift 3 y 4, iOS 10 y 11, Xcode 9 y 10
Para mí, este método no funciona:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
cuando solía ver cada controlador de vista, pero esto funcionó:
-
En el archivo info.list, agregue fila:
View controller-based status bar appearance
y establezca enNO
-
Siguiente en appdelegate:
UIApplication.shared.statusBarStyle = .lightContent
Swift 4+
para el texto blanco de la barra de estado:
navigationController.navigationBar.barStyle = .blackTranslucent
iOS 11.2
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .black
return true
}
rápido 3
si Ver la apariencia de la barra de estado basada en el controlador = SÍ en Info.plist
luego use esta extensión para todos los NavigationController
extension UINavigationController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
si no hay UINavigationController y solo tiene UIViewController, use el siguiente código:
extension UIViewController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}