Cambiar el color de la barra de estado para ViewControllers específicos usando Swift en iOS8

193
override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

El uso del código anterior en cualquier ViewController para establecer el color de la barra de estado en Blanco para un controlador de vista específico no funciona en iOS8 para mí . ¿Alguna sugerencia? Usando el método UIApplication.sharedApplication, el color cambia después de los cambios requeridos en Info.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 ViewControllers específicos y necesarios ?

Anuj
fuente

Respuestas:

349

Después de leer todas las sugerencias y probar algunas cosas, podría hacer que esto funcione para controladores de vista específicos utilizando los siguientes pasos:

Primer paso:

Abra su info.plist e inserte una nueva clave llamada " Ver la apariencia de la barra de estado basada en el controlador " en NO

Segundo paso (solo una explicación, no es necesario implementar esto):

Normalmente ponemos el siguiente código en la aplicación (_: didFinishLaunchingWithOptions :) método del AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

pero eso afecta el statusBarStylede todos los ViewControllers.

Entonces, cómo hacer que esto funcione para ViewControllers específicos: paso final:

Abra el archivo viewcontroller donde desea cambiar statusBarStyley coloque el siguiente código viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Además, implemente el viewWillDisappear()método para ese viewController específico y coloque 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 statusBarStylecontrol de vista específico y luego lo volverá a cambiar defaultcuando el controlador de vista específico desaparezca. No implementar el viewWillDisappear()cambiará statusBarStylepermanentemente al nuevo valor definido deUIStatusBarStyle.LightContent

Anuj
fuente
44
Tenga en cuenta que si configura el Status bar is initially hidden = YESarchivo info.plist, "Ver apariencia de la barra de estado basada en el controlador = NO" hará que la barra de estado se oculte.
xi.lin
13
Si está volviendo a UIStatusBarStyle.Defaultusar viewWillDisappear(), debería usarlo viewWillAppear()para inicializarlo, en lugar de viewDidLoad()... de lo contrario, si vuelve a esa vista sin tener que volver a cargarla, no verá lo StatusBarStyleque está esperando.
William GP
77
Para Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz el
44
Todavía no está claro cómo cambia el color de la barra de estado
DoruChidean
44
Chicos, está en desuso de iOS 9
porJeevan
109

(A partir del 20 de septiembre de 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}
BennyTheNerd
fuente
77
Asegúrese de llamar super.viewWillAppearsi está copiando y pegando este código
Stephen Silber
Editado para incluir super.viewWillAppear (). ¡Gracias @StephenSilber por el dato!
BennyTheNerd
tienes que anular el PreferredStatusStyle o no funcionará. gracias por señalar eso. +1
Alix
3
Utilizando los UIApplication.shared.statusBarStyle = .lightContentresultados en esta advertencia del compilador: Setter para 'statusBarStyle' fue desaprobado en iOS 9.0: Uso - [UIViewController preferredStatusBarStyle]
airowe
3
En Info.plist de su aplicación, configure "Ver apariencia de la barra de estado basada en el controlador" en SÍ
IvanPavliuk
31

Solución Swift 4.2 con NavigationController

Primer paso:

Abra su info.plist e inserte una nueva clave llamada " Ver la apariencia de la barra de estado basada en el controlador " o UIViewControllerBasedStatusBarAppearanceen para permitir que cada VC use su propia propiedad de estado.

Segundo paso

En cada VC, anule la propiedad preferredStatusBarStyle de esta manera:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

Último paso

Anule la propiedad preferredStatusBarStyle en su clase personalizada NavigationController:

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}
guillama
fuente
Esta es solo la forma de lograr el resultado esperado utilizando el Controlador de navegación y sus propios controladores. También podría hacerlo de esta manera para prefersStatusBarHidden como lo hice para mi proyecto :)
atereshkov
29

Seguí este tutorial y funcionó para mí. Sin embargo, no estoy seguro de si hay algunas advertencias.

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • Abra su info.plist y configúrelo UIViewControllerBasedStatusBarAppearanceen false.
  • En la primera función AppDelegate.swift, que contiene didFinishLaunchingWithOptions, establece el color que deseas.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Actualización de Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent

chris_s
fuente
11
¿Cómo es eso específico para cada controlador de vista
Yarneo
44
Exactamente, esto es para la aplicación completa, y esa no es la pregunta.
Anuj
3
Estoy usando iOS 8 Swift y xCode 6.1.1 y solo seguir estos dos pasos no funciona. También debe agregar UIApplication.sharedApplication().statusBarHidden = falsea AppDelegate.swift didFinishLauchingWithOptions
Ahmad Amin
Esto lo configuró para toda la aplicación. Para controladores de vista específicos, vea la primera respuesta. A mí me funcionó.
Akshar Patel
Setter para 'statusBarStyle' fue desaprobado en iOS 9.0: Uso - [UIViewController preferredStatusBarStyle]
Oleksandr
22

Hay mil millones de respuestas aquí, así que pensé por qué no agregar otra en forma de 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
        }
    }
}

Implementación:

UIApplication.statusBarBackgroundColor = .blue
John R Perry
fuente
2
Tenga en cuenta que este enfoque podría considerarse el acceso a una API privada, y puede significar que Apple rechazará su aplicación.
JWhitey
O al menos depende de los detalles de implementación de Apple y puede romperse sin previo aviso con cambios en iOS.
Chris Prince
19

En su Info.plist, debe definir Ver la apariencia de la barra de estado basada en el controlador en cualquier valor.

Si lo define SÍ, debe anular la función preferredStatusBarStyle en cada controlador de vista.

Si lo define NO, puede configurar el estilo en AppDelegate usando

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Nikita Khandelwal
fuente
77
setStatusBarStylefue desaprobado en iOS 9.0
Jeffrey Neo
@Jeffrey_Neo Aunque eso es cierto, no puedo conseguir que el reemplazo funcione. Sería útil ver su comentario como una respuesta con código de trabajo.
dumbledad
15
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()
    }

}
AG
fuente
el uso valueForKey("statusBar")puede no cumplir con las pautas de Apple
Cœur
15

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 configurar el color de fondo de la barra de estado para un controlador de vista específico.

Chris Tsitsaris
fuente
3
UIView siempre responde a backgroundColor en Swift.
Cœur
13

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()
    }
AJ Hernández
fuente
10

Implementar preferredStatusBarStylecomo usted ha mencionado y llamada self.setNeedsStatusBarAppearanceUpdate()en ViewDidLoady también en conjunto Info.plist UIViewControllerBasedStatusBarAppearancea YES(Es YESpor defecto)

No está claro por qué no funciona. Necesito verificar el código. Otra sugerencia es ir con el código de trabajo viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContenty cambiarlo a predeterminado cuando vea desaparecer viewWillDisappear.

codificador
fuente
Solo implementar la primera parte de la respuesta funcionó para mí. Sin embargo, no agregué el UIViewcontrollerBasedStatusBarAppearance en Info.plist. Aún funcionó.
Akshar Patel
10

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
    }
Giang
fuente
1
Probé todas las soluciones ... ¡esto solo funcionó para mí! No sé por qué: D
Khaled Hayek
suerte del sorteo
Giang
Setter para 'isStatusBarHidden' desfasada y en iOS 9.0: Uso - [UIViewController prefersStatusBarHidden] ...
sacó ..
9

En mi situación, uso storyboard para organizar mis controladores de vista. Quiero cambiar todo el estilo de la barra de estado.

Puedes ver en la imagen de abajo.

ingrese la descripción de la imagen aquí

StarsView Controller es una CPBaseNavigationController, y CPBaseNavigationControlleres una subclase de UINavigationController.

Intento hacer los siguientes ajustes:

  1. En AppDelegate.swiftfunc didFinishLaunchingWithOptions, agregue

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    Pero sin efecto.

  2. En StoryBoard, busque la Base Tab BarController(imagen de arriba) .seleccione Attributes Inspector, cambie el Sattus Baratributo a Light Content.so mal, sin efecto.

ingrese la descripción de la imagen aquí

  1. Lo último lo consigo. En mi controlador de navegación personalizado CPBaseNavigationController, agregue funcpreferredStatusBarStyle

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }

    ¡Funciona bien!

Además, statusBarStyleen desuso en 9.0, puedes usar -[UIViewController preferredStatusBarStyle].

wenghengcong
fuente
9

Funciona para la aplicación basada en 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)
Jio
fuente
Dónde agregar este código específico, simplemente no podría hacer que esto funcione.
Anuj
Puede agregarlo en el archivo delegado de la aplicación en didFinishLaunchingWithOptions
Jio
1
¿No sería mejor usar addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Limits.width, 20) en lugar de un ancho de 320 codificado?
Torsten Ojaperv
Editado @TorstenOjaperv
Jio
¿Cómo hacerlo con swift 3.0?
YETI
8

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 {

inserte esto:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Anton Rusia
fuente
1
Los valores rojo, verde y azul están en el rango de 0 a 1. Debe dividirlos por 255 o no funcionará.
Makalele
8

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
    }
}
el cangrejo
fuente
7

Swift 4 Para ViewController específico sin navegación ViewController incrustado simplemente agregue esto a su archivo ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
Surjit Singh
fuente
Si tenemos un controlador de navegación incorporado, ¿qué haces?
icekomo
7

Otra forma realmente fácil de hacer que esto funcione es simplemente crear una extensión de la clase UINavigationController.

Dado que anular el preferredStatusBarStyle:método no funcionará A MENOS QUE lo hagamos dentro de la clase UINavigationController.

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }
azemi
fuente
4

Había establecido un color específico (en formato RGB) usando el siguiente código en el App Delegatearchivo:

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 Info.plistarchivo:

Vea la apariencia de la barra de estado basada en el controlador con un valor booleano establecido en NO

Captura de pantalla 1

Captura de pantalla 2

Jayprakash Dubey
fuente
Con Siwft 3.0, ¿cómo hacerlo?
YETI
4

Puedo sugerirte una forma más simple,

  1. 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 o el estilo oculto / oculto. Si llama a este método dentro de un bloque de animación, los cambios se animarán junto con el resto del bloque de animación.

  1. Implemente preferredStatusBarStyle devolviendo su tipo preferido.

Funcionó para mí en iOS 10.1.

C objetivo

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Rápido

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Me sorprende que nadie haya señalado esto. De todos modos disfruta :)

Bhaumik Desai
fuente
4

Tuve algunos problemas con este. Realmente no me sentí bien al cambiar globalmente el color de la barra de estado a la vista y luego cambiarlo nuevamente a la vista desapareció como la respuesta aceptada. Lo creas o no, puedes hacer que esto funcione anulando preferredStatusBarStyletu controlador de vista deseado. Después de mucho tiempo, esto es lo que hice para que funcione:

  1. Cambie la apariencia de la barra de estado basada en el controlador Ver en su info.plista SÍ.
  2. Ahora cualquier controlador de vista de pantalla completa puede cambiar el estilo de la barra de estado anulando preferredStatusBarStyle .
  3. Especifico pantalla completa porque esto no funcionará para los controladores de vista modal (no pantalla completa), no sin configurar modal​Presentation​Captures​Status​Bar​Appearance Sí, eso es.
  4. Además, si tiene controladores de vista integrados, como en un controlador de navegación, por ejemplo, le pedirá al controlador de vista superior el estilo de la barra de estado. child​View​Controller​For​Status​Bar​StyleSe supone que anular y pasar el controlador de vista incorporado funciona, pero no lo hizo para mí. Así que acabo de devolver la barra de estado preferida de los controladores de vista incrustados 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
    }
John C.
fuente
¡Esta respuesta me ayudó! Descubrí que, por alguna razón, mi controlador de navegación (que se presenta modalmente) no estaba pidiendo implícitamente al controlador de vista superior su estilo de barra de estado. Así que tuve que subclasificar UINavigationControllery anular la child​View​Controller​For​Status​Bar​Stylevar allí, volviendo self.topViewController.
taber
3

En Swift 4 o 4.2

Puedes agregar tu vc

preferredStatusBarStyle

y establezca el valor de retorno en

.lightContent o .default

ex:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}
Ridho Octanio
fuente
3

(A partir del 10 de junio de 2020)

Swift 5 ( sin editar .Plistarchivo )

Si está utilizando Storyboard, vaya al NavigationController, seleccione el navigationBar, haga clic en el Attributes Inspector, luego cambie el style. si necesita light content( barra de estado blanca ) configúrelo todo excepto defaultdigamos establecer estilo blackY si lo desea dark content ( barra de estado negra ) configúrelo default.

El valor predeterminado ( UIBarStyleDefault) da como resultado la UIStatusBarStyleDefaultbarra de estado de primer plano oscuro . Y UIBarStyleBlackle dará una UIStatusBarStyleLightContentbarra de estado.

Programáticamente

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Sin barra de navegación ( Editar.Plist )

agregar UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearancea su info.plist, y establecer el valor es true.

Overridela preferredStatusBarStylepropiedad en su controlador

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}
jawadAli
fuente
2

Actualización de Swift 3.0

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
Jaseibert
fuente
2

Lo que funcionó conmigo, en el Guión gráfico, 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!

Amr
fuente
2

SWIFT 4.2 Hola, quería compartir una solución, que funcionó para mí que obtuve de un gran artículo sobre este tema evasivo de Graig Grummitt.

Paso 1 Como otros han mencionado AGREGAR a continuación a su PLIST

View controller-based status bar appearance YES

Paso 2 en el RootViewcontroller agregar a continuación

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

Al actualizar cualquiera de las propiedades statusBarHiddeno vcStatusBarStylellamará setNeedsStatusBarAppearanceUpdate()y actualizará la barra de estado con los nuevos valores para prefersStatusBarHiddeno preferredStatusBarStyle. En mi situación, tuve que actualizar estas propiedades para el contenedor viewcontroller, que era el padre del childviewcontroller visible. Hice esto usando un método simple de delegado.

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

Por supuesto, al instanciar el childViewController (Visible VC) no olvide establecer el MainViewcontroller (Container VC) como su delegado. A veces lo hago. :)

childViewController.delegate = self

Luego, en childViewController, acabo de llamar al método delegado cuando era necesario para actualizar la barra de estado.

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

Como se mencionó anteriormente, Graig Grummitt entra en más detalles sobre esta solución y también trabaja con UINavigationControllers. Enlace aquí: El misterioso caso de la barra de estado

Erik Uecke
fuente
1

Haga clic en el grupo Archivos de soporte (lado superior izquierdo - nombre de su proyecto). Navega a Información. Haga clic en + en algún lugar entre las listas, como el nombre del paquete a continuación. Y agregue "Ver la apariencia de la barra de estado basada en el controlador" y configúrelo en NO. Luego abra AppDelegate.swift y modifíquelo así:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

return true
}

Eso es.

Goran Jakovljevic
fuente
Has leído mal la pregunta. Pregunté acerca de cómo cambiar el StatusBarStyle para viewcontrollers específicos, no para la aplicación completa.
Anuj
Comprueba mi respuesta a continuación @Anuj
theCrab
1

Para Xcode 10 puede crear una clase y ponerla antes de su clase viewController, puede llamar a esta clase en todos los controles de vista se necesita una barra de estado de contenido ligero ...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

Ahora cambie su clase viewController en:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

Y eso es todo...

Fabio
fuente
1

Funciona para la navegación basada en un controlador de vista particular en swift4

   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)
Gangireddy Rami Reddy
fuente
1

ADVERTENCIA


Setter para 'statusBarStyle' quedó en desuso en iOS 9.0: Uso - [UIViewController preferredStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

entonces mi solución fue la siguiente: hacer una extensión desde el controlador de navegación:

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        if let topViewController = presentedViewController{
            return topViewController.preferredStatusBarStyle
        }
        if let topViewController = viewControllers.last {
            return topViewController.preferredStatusBarStyle
        }

        return .default
    }
}

y si tiene un viewController que tendrá otro estilo que el estilo de la aplicación, puede hacer esto

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

digamos que su estilo de estado de la aplicación es .defaulty desea que esta pantalla sea .lightContent así, barStyle tomará el .lightContentvalor predeterminado, esto cambiará el estilo de la barra de estado a lightContent y luego asegúrese de viewWillDisappearcambiar el estilo de la barra de estado nuevamente al estilo de la barra de estado de la aplicación que en nuestro caso es.default .

esto funciona para mi

hesham ghalaab
fuente
1

Color personalizado para la barra de estado (iOS11 +, Swift4 +)

Si está buscando una solución para cambiar la barra de estado a su color personalizado, esta es la solución de trabajo.

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
Tung Fam
fuente