programar programación programacion para lenguaje gratis desde descargar crear caracteristicas apple aplicaciones ios swift uiviewcontroller uistatusbar ios-statusbar

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

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:

  1. Al inicializar la pantalla, cuando se está preparando la IU.
  2. 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 (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.

  1. Seleccione Proyecto del Navegador de proyectos (panel lateral izquierdo).
  2. Seleccione un objetivo.
  3. Seleccione la pestaña General.
  4. Encuentra información de implementación.
  5. Cambie el estilo de la barra de estado a Claro (para fondo oscuro "Claro" , Fondo claro "Predeterminado" )

No olvide los cambios de info.plist

  1. Seleccione la pestaña Información
  2. 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:

  1. Establezca UIViewControllerBasedStatusBarAppearance en YES en el archivo .plist , si necesita establecer el estilo de la barra de estado solo en el nivel UIViewController.
  2. En la función viewDidLoad add - setNeedsStatusBarAppearanceUpdate

  3. 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

  1. Cree una nueva entrada en info.plist "Ver la apariencia de la barra de estado basada en el controlador" configúrela en "SÍ".
  2. 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)
  3. Vaya al panel derecho y haga clic en la sección de atributos.
  4. 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

  1. Cree una nueva entrada en info.plist "Ver la apariencia de la barra de estado basada en el controlador" configúrela en "NO".

  2. 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 en NO

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