Cómo configurar el estilo de la barra de estado en Swift 3

186

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?

Willjay
fuente
intente con esta var preferredStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Respuestas:

485

[ACTUALIZADO] Para Xcode 10+ y Swift 4.2+

Este es el método preferido para iOS 7 y superior

En su aplicación Info.plist, configure View controller-based status bar appearanceen YES.

Anular preferredStatusBarStyle ( documentos de Apple ) en cada uno de sus controladores de vista. Por ejemplo:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Si ha preferredStatusBarStyledevuelto 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 setNeedsStatusBarAppearanceUpdate()cuando ese estado cambie.

iOS anterior a la versión 7, método obsoleto

Apple ha desaprobado esto , por lo que se eliminará en el futuro. Utilice el método anterior para no tener que volver a escribirlo cuando se lance la próxima versión de iOS.

Si su aplicación será compatible con la de su aplicación Info.plist, configure View controller-based status bar appearanceen NO.

En appDelegate.swiftla didFinishLaunchingWithOptionsfunción, agregue:

UIApplication.shared.statusBarStyle = .lightContent

Para el controlador de navegación

Si utiliza un controlador de navegación y desea que el estilo de barra de estado preferido de cada controlador de vista que se utilizará y establece View controller-based status bar appearanceque YESen sus aplicaciones deinfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}
PRAVEEN
fuente
3
Funciona para mi. Olvidé insertar la nueva configuración en Info.plist primero.
falsecrypt
1
@LightMan el estado de la aplicaciónBarStyle no está en desuso, lo usé en iOS 11 y funciona.
Sushobhit
1
@Sushobhit setStatusBarStyle fue desaprobado en iOS 9, como se usa en esta respuesta. Pero aún tiene UIApplication.statusBarStyle como una propiedad de solo lectura.
LightMan
1
Hay momentos en los que desea poder configurarlo programáticamente debido al color de cada vista.
Alejandro Cavazos
9
También puede eliminar la línea en appDelegate.swift e ir a Destino -> General -> Información de implementación -> Estilo de barra de estado -> Luz
Robert Veringa
162

Ú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.infoprá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: defaultque es texto negro sobre fondo blanco o lightContenttexto 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

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 UIViewControllerinstancia 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 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 statusBarobjeto usando KVC y establece su color de fondo. El objeto que se obtiene de esta manera es UIStatusBar, que se deriva UIViewy, por lo tanto, naturalmente es compatible con la backgroundColorpropiedad. 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 UINavigationBarenfoque, 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 (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")
        }
    }
}
Hexfire
fuente
2
Una vez que tenga la barra de estado, también puede hacer esto: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); o use cualquier clave existente para establecer cualquier propiedad que esté disponible para UIStatusBar pero no para UIView
Marque el
application.statusBarStyle = .lightContent este enfoque es generalmente porque iOS9> Setter para 'statusBarStyle' fue desaprobado en iOS 9.0: Use - [UIViewController preferredStatusBarStyle] la espera para ir es para UIViewController
toxicsun
Esto es lo único que funciona aquí cuando se cambia el tema de color de la aplicación. Sin embargo, parece que, una vez que se ha configurado, siempre debe restablecerlo al cambiar los controladores de vista. El método preferredStatusBarStyle () se ignora de aquí en adelante (incluso con la configuración adecuada en info.plist).
nontomatic
2
Esta respuesta es más descriptiva en comparación con otras.
ViruMax
2
La solución de bonificación está rota en iOS 13.1
ViruMax
130

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 setNeedsStatusBarAppearanceUpdate()para animar el cambio cuando esté listo

Abizern
fuente
2
Este es un mejor enfoque, ya que puede elegir prefersStatusBarHiddenalgunas de sus vistas. Si vas con UIApplication.shared.statusBarStyleeso, te quedarás atrapado.
superarts.org
105

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 appearancey configúrelo enNO

  • Siguiente en appdelegate:

    UIApplication.shared.statusBarStyle = .lightContent
Gracu
fuente
Intenté solo después de agregar código al delegado de la aplicación, pero la configuración de la lista de información me fue útil. Gracias
Akhilesh Sharma
66
Setter para 'statusBarStyle' quedó en desuso en iOS 9.0: Uso - [UIViewController preferredStatusBarStyle]
Reimond Hill
33

Si desea cambiar el statusBarcolor de 's a blanco, para todas las vistas contenidas en a UINavigationController, agregue esto dentro 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 UIViewControllerscontenido en a UINavigationController, porque el compilador busca el contenido statusBarStyledel UINavigationController, no statusBarStyleel ViewControllerscontenido del contenido.

¡Espero que esto ayude a aquellos que no han tenido éxito con la respuesta aceptada!

Sr. Xcoder
fuente
¡Si muchas gracias! ¡El controlador de navegación era un pequeño matiz que muchos no consideraron!
Alexis Candelaria
26

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 
        } 
    }
alex de oliveira
fuente
1
YIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G
26

Xcode 10 o posterior

Probado en Swift 5

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 y 11.0

Vivek
fuente
Para Xcode 10 / Swift5, esta debería ser la respuesta aceptada. Debe hacer AMBOS pasos para que esto funcione.
John Robi
Perfecto. ¡Gracias! Estoy de acuerdo en que esta debería ser la respuesta aceptada real.
DungeonDev
Esta es la respuesta perfecta 🤟🏻
nikhilgohil11
Esto funciona totalmente también para xcode 11 con swift 5, gracias
Luis Santiago
25

Debe agregar la siguiente clave en su archivo Info.plist:

View controller-based status bar appearance con valor booleano establecido en NO

En su clase appdelegate, en didFinishLaunchingWithOptionsmétodo 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

cambio backgroundColory statusBarStylesegún requerimiento.

Himanshu padia
fuente
Buena solución, pero ¿esto cuenta como usar una API privada?
GoldenJoe
Funciona bien, pero ¿cómo puedo cambiar a mi color personalizado?
iSrinivasan27
@MohanSrinivasan en lugar de "UIColor.red" puede especificar su color personalizado.
Himanshu padia
13

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

ingrese la descripción de la imagen aquí

(Hecho con Xcode 8.3.3 en un proyecto todo Swift)

Bryan Norden
fuente
"Ver la apariencia de la barra de estado basada en el controlador" debe establecerse en "NO"
Willjay el
2
Una forma muy limpia de establecer el estilo de la barra de estado de acuerdo con el contenido del Controlador de vista, que es la forma correcta en lugar de solo configurar View controller-based status bar appearance = NOy tener que usar solo un estilo claro u oscuro en toda la aplicación. Es una pena que esta forma "sin código" funcione solo en el controlador de navegación, Apple debería considerar agregar otro campo para configurar esta opción dentro de cualquier instancia del controlador de vista.
aldoram5
12

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:

2.1 ) Lista de información

Ver la apariencia de la barra de estado basada en el controlador -> SÍ

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Objective-C (o reaccionar nativo) cambiando de delegado de aplicaciones:

1) Info.plist add:

Ver la apariencia de la barra de estado basada en el controlador -> NO

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

Cambiar la barra de estado no funciona al intentar hacer push (controladores de navegación), solo al presentar modalmente los controladores de vista.

Doci
fuente
8

El primer paso debe agregar una fila con clave: View controller-based status bar appearancey valor NOal Info.plistarchivo. 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    
}
javimuu
fuente
6

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()

    }

}
youareawaitress
fuente
6

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 establecer la apariencia de la barra de estado basada en el controlador Ver entrada .plist 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 luchan, 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 :)

nCr78
fuente
6

Para agregar a la gran respuesta por @Krunal https://stackoverflow.com/a/49552326/4697535

En caso de que esté utilizando a UINavigationController, el preferredStatusBarStyleno tendrá ningún efecto en elUIViewController .

Xcode 10 y Swift 4.

Establecer una costumbre UINavigationController

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
      }
  }
}
Tal Zion
fuente
5

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

joemalski
fuente
5

Swift 4+

para el texto blanco de la barra de estado:

navigationController.navigationBar.barStyle = .blackTranslucent
Alfi
fuente
5

Aquí están las instrucciones / instrucciones de Apple sobre el cambio de estilo de la barra de estado.

Si desea establecer el estilo barra de estado, nivel de aplicación a continuación, establece UIViewControllerBasedStatusBarAppearanceque NOen su .plistarchivo. Y en su appdelegate> didFinishLaunchingWithOptionsadd following 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 UIViewControllerBasedStatusBarAppearancea YESen el .plistarchivo, 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.

ingrese la descripción de la imagen aquí

Krunal
fuente
4

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
}
Karthickkck
fuente
4

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
}
Satish Babariya
fuente
'blackOpaque' no está disponible: use UIStatusBarStyleLightContent
Makalele
3

Esto funciono para mi

Establezca la View controller-based status barapariencia en NO en plist y luego en UIViewController viewDidAppearacaba de agregar la siguiente línea

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Anshad Rasheed
fuente
setStatusBarStyle está en desuso en iOS 9.
Lastmboy
3

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 código A continuación:

    extension UIViewController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }
Datt Patel
fuente
2
No funciona para mi Recibo los errores "La propiedad no anula ninguna propiedad de su superclase" y "Getter para 'preferredStatusBarStyle' con el selector Objective-C 'preferredStatusBarStyle' entra en conflicto con la declaración anterior con el mismo selector Objective-C".
Theo
Gracias por esto, después de 20 intentos diferentes y algunas combinaciones de elementos para probar, esta es la forma de establecer el color de la barra de estado. Solo tenía que recordar llamar a setNeedsStatusBarAppearanceUpdate () cuando quería cambiar el color ya que estaba agregando en modo nocturno y el negro sobre negro simplemente no funcionaba.
Stuart P.
3

Swift 5

Para agregar más detalles para la respuesta de PRAVEEN en https://stackoverflow.com/a/40066798/2082851 , me gustaría proporcionar mi implementación. Admite la flexibilidad para personalizar la barra de estado de cada controlador.

En general, crearemos uno BaseViewControllerque maneje la statusBarStylepropiedad en todos los casos. Cuando cree un nuevo controlador, hágalo como una subclase de este controlador base.

Siempre que desee cambiar la apariencia del estado, solo necesita actualizar esta propiedad. El estilo de la barra de estado se actualizará inmediatamente.

Implementación

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

Manifestación

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

ingrese la descripción de la imagen aquí

2) UINavigationController

Para UINavigationController, es un caso especial, que puede seguir cualquiera de las soluciones:

Solución A: anulación con envío de mensaje

Dado que UINavigationController es NSObjecty hereda de ObjectiveC, sus métodos son message dispatchy puede anularlos.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Solución B: crear UINavigationControllersubclase

Si ya tiene una costumbre UINavigationController(que generalmente necesita controlar más requisitos), esta es la mejor solución para usted.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}
nahung89
fuente
2

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
         })
     }
 }
tiantong
fuente
¿Qué es la propiedad navView? gracias por compartir su solución
medskill
1
@medskill navView es solo una barra de navegación de imitación añadida mediante programación.
tiantong
2

La mayoría de estas respuestas son repetitivas, pero ninguna de ellas aborda la pantalla de inicio cuando uso un fondo oscuro.

Resolví esto con lo siguiente en mi info.plistque produjo una barra de estado de estilo claro.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
CodeBender
fuente
2

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
Richard Hope
fuente
2

Si está utilizando una presentación modal, debe configurar:

viewController.modalPresentationCapturesStatusBarAppearance = true
RomanMisnikov
fuente
1

En iOS 13, puede usar la .darkContent UIStatusBarStylepropiedad para mostrar la barra de estado oscura

Hubert Fabisiak
fuente
1

Si aún no puede cambiar la base de estilo de la barra de estado en el método

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Puede intentar usar este método:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
Jin
fuente
0

Para el objetivo C simplemente agregue esta línea en su aplicación didFinishLaunch method

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Asfand Shabbir
fuente
3
Esto ha quedado en desuso desde iOS 9
MK_Dev
0

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
    }

}
Hombre oracular
fuente
3
Swift 9.3? Año incorrecto, Marty
Unidad de iOS
Recomiendo mantenerse alejado del uso de API privada para un "statusBar" exacto. ¡Apple hace cambios en la API de vez en cuando! Y cuando Apple cambia esa API, su aplicación puede bloquearse y ya no cambiará la barra de estado. Esto te hará buscar nuevamente otra solución.
Doci