Modifica del colore della barra di stato per specifici ViewController utilizzando Swift in iOS8


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

Utilizzando il codice sopra in qualsiasi ViewController per impostare il colore statusBar su Bianco per un viewcontroller specifico non funziona in iOS8 per me . Eventuali suggerimenti? Utilizzando il metodo UIApplication.sharedApplication, il colore cambia dopo le modifiche richieste in Info.plist per l'intera app.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

Come posso apportare modifiche al colore della barra di stato per alcuni ViewController richiesti e specifici ?

Risposte:


349

Dopo aver letto tutti i suggerimenti e provato alcune cose, ho potuto farlo funzionare per specifici viewcontroller usando i seguenti passaggi:

Primo passo:

Apri la tua info.plist e inserisci una nuova chiave denominata " Visualizza l'aspetto della barra di stato basata sul controller " su NO

Secondo passo (solo una spiegazione, non è necessario implementarlo):

Normalmente inseriamo il seguente codice nell'applicazione (_: didFinishLaunchingWithOptions :) metodo dell'AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

ma ciò influisce statusBarStylesu tutti i ViewController.

Quindi, come farlo funzionare per ViewController specifici - Fase finale:

Apri il file viewcontroller in cui desideri modificare il statusBarStylee inserisci il seguente codice viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Inoltre, implementa il viewWillDisappear()metodo per quel viewController specifico e inserisci le seguenti righe di codice,

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
}

Questo passaggio cambierà prima il statusBarStyleviewcontroller specifico e poi lo cambierà nuovamente defaultquando il viewcontroller specifico scompare. Non implementando il viewWillDisappear()cambierà statusBarStyledefinitivamente il nuovo valore definito diUIStatusBarStyle.LightContent


4
Notare che se si imposta Status bar is initially hidden = YESnel file info.plist, "Visualizza aspetto barra di stato basata sul controller = NO", la barra di stato verrà nascosta.
xi.lin,

13
Se stai tornando a UIStatusBarStyle.Defaultusare viewWillDisappear(), dovresti usarlo viewWillAppear()per inizializzarlo, piuttosto che viewDidLoad().... altrimenti se torni a quella vista senza doverlo ricaricare, non vedrai ciò che StatusBarStyleti aspetti.
William GP,

7
Per Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz,

4
Non è ancora chiaro come si cambia il colore della barra di stato
DoruChidean,

4
Ragazzi, è deprecato da iOS 9
Jeevan il

109

(Dal 20 settembre 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}

7
Assicurati di chiamare super.viewWillAppearse stai copiando e incollando questo codice
Stephen Silber,

Modificato per includere super.viewWillAppear (). Grazie @StephenSilber per l'informazione!
BennyTheNerd,

devi sovrascrivere loStatusStyle preferito o non funzionerà. Grazie per la segnalazione. +1
Alix,

3
Utilizzo dei UIApplication.shared.statusBarStyle = .lightContentrisultati in questo avviso del compilatore: Il setter per 'statusBarStyle' è stato deprecato in iOS 9.0: Usa - [UIViewController PreferualStatusBarStyle]
airowe,

3
In Info.plist dell'applicazione, imposta "Visualizza aspetto barra di stato basata su controller" su SÌ
IvanPavliuk

31

Soluzione Swift 4.2 con NavigationController

Primo passo:

Apri la tua info.plist e inserisci una nuova chiave denominata " Visualizza l'aspetto della barra di stato basata sul controller " o UIViewControllerBasedStatusBarAppearancesu per consentire a ciascun VC di utilizzare la propria proprietà di stato.

Secondo passo

In ogni VC, sovrascrivere la proprietà preferitaStatusBarStyle in questo modo:

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

Ultimo passo

Sostituisci la proprietà preferitaStatusBarStyle nella tua classe NavigationController personalizzata:

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
}

Questo è solo il modo in cui ottenere il risultato atteso utilizzando il controller di navigazione e i propri controller. Inoltre potresti fare così per i prefersStatusBarHidden come ho fatto per il mio progetto :)
atereshkov,

29

Ho seguito questo tutorial e ha funzionato per me. Tuttavia, non sono sicuro che ci siano avvertenze.

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

  • Apri la tua info.plist e imposta UIViewControllerBasedStatusBarAppearancesu false.
  • Nella prima funzione in AppDelegate.swift, che contiene didFinishLaunchingWithOptions, imposta il colore desiderato.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Aggiornamento Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent


11
com'è specifico per ciascun controller di visualizzazione
Yarneo,

4
Esatto, questo è per l'app completa e non è questa la domanda.
Anuj,

3
Sto usando iOS 8 Swift e xCode 6.1.1 e solo seguendo questi due passaggi non funziona. Devi anche aggiungere UIApplication.sharedApplication().statusBarHidden = falseall'AppDelegate.swift didFinishLauchingWithOptions
Ahmad Amin

Questo lo ha impostato per l'intera applicazione. Per controller di visualizzazione specifici, vedere la prima risposta. Ha funzionato per me.
Akshar Patel,

Il setter per "statusBarStyle" è stato deprecato in iOS 9.0: Usa - [UIViewController preferitoStatusBarStyle]
Oleksandr

22

Ci sono un miliardo di risposte qui, quindi ho pensato perché non aggiungerne un altro sotto forma di estensione (con l'aiuto di @ Cœur)

Swift 3

Estensione:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

Implementazione:

UIApplication.statusBarBackgroundColor = .blue

2
Tieni presente che questo approccio potrebbe essere considerato l'accesso a un'API privata e potrebbe significare che la tua app verrà rifiutata da Apple.
JWhitey,

O almeno dipende dai dettagli di implementazione di Apple e potrebbe interrompersi senza preavviso con modifiche in iOS.
Chris Prince,

19

Nel tuo Info.plist devi definire Visualizza l'aspetto della barra di stato basata su controller su qualsiasi valore.

Se lo si definisce SÌ, è necessario sovrascrivere la funzione preferitaStatusBarStyle in ciascun controller di visualizzazione.

Se lo definisci NO, puoi impostare lo stile in AppDelegate usando

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

7
setStatusBarStyleè stato deprecato in iOS 9.0
Jeffrey Neo,

@Jeffrey_Neo Anche se è vero, non riesco a far funzionare la sostituzione. Sarebbe utile vedere il tuo commento come una risposta con un codice funzionante.
silente il

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

}

l'utilizzo valueForKey("statusBar")potrebbe non essere conforme alle linee guida 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
} 

Questa è la soluzione per impostare il colore di sfondo della barra di stato per un controller di visualizzazione specifico.


3
UIView risponde sempre a backgroundColor in Swift.
Cœur

13

SWIFT 2

Sono stato in grado di modificare correttamente l'aspetto dello sfondo della barra di stato aggiungendo quanto segue nel mio viewWillAppear:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }

10

Implementare preferredStatusBarStylecome lei ha ricordato e chiamata self.setNeedsStatusBarAppearanceUpdate()in ViewDidLoaded anche in Info.plist insieme UIViewControllerBasedStatusBarAppearancea YES(E 'YES per impostazione predefinita)

Non è chiaro il motivo per cui non funziona. Devo controllare il codice. Un altro suggerimento è andare con il codice di lavoro attivo viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContente modificarlo come predefinito quando vedi sparire viewWillDisappear.


L'implementazione della prima parte della risposta ha funzionato per me. Tuttavia, non ho aggiunto UIViewcontrollerBasedStatusBarAppearance in Info.plist. Funzionava ancora.
Akshar Patel,

10

per rapido 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
    }

1
Ho provato tutte le soluzioni ... questo ha funzionato solo per me !! Non so perché: D
Khaled Hayek,

fortuna del sorteggio
Giang

Il setter per 'isStatusBarHidden' è stato deprecato in iOS 9.0: Usa - [UIViewController preferisceStatusBarHidden] ...
disegnato il

9

Nella mia situazione, utilizzo lo storyboard per organizzare i miei controller di visualizzazione. Voglio cambiare tutto lo stile della barra di stato.

Puoi vedere nella foto qui sotto.

inserisci qui la descrizione dell'immagine

StarsView Controller è un CPBaseNavigationController, ed CPBaseNavigationControllerè una sottoclasse di UINavigationController.

Provo a fare i prossimi set:

  1. In AppDelegate.swiftfunc didFinishLaunchingWithOptions, aggiungi

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

    ma nessun effetto.

  2. In StoryBoard, trova la Base Tab BarController(foto sopra) .select Attributes Inspector, modifica l' Sattus Barattributo in Light Content.so cattivo, nessun effetto.

inserisci qui la descrizione dell'immagine

  1. Ultimo ho capito.Nel mio controller di navigazione personalizzato CPBaseNavigationController, aggiungere funcpreferredStatusBarStyle

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

    Funziona bene!

Inoltre, statusBarStyledeprecato in 9.0, puoi usare -[UIViewController preferredStatusBarStyle].


9

Funziona per l'applicazione basata sulla navigazione

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)

Dove aggiungere questo codice specifico, non riesco proprio a farlo funzionare.
Anuj,

Puoi aggiungerlo nel file delegato dell'app in didFinishLaunchingWithOptions
Jio

1
Non sarebbe meglio usare addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) invece della larghezza di 320 con codice fisso?
Torsten Ojaperv,

A cura di @TorstenOjaperv
Jio,

Come farlo con Swift 3.0?
ANCORA

8

Tutto è molto più semplice in Swift 3.0 Xcode 8

Utilizzando il codice seguente nel file Delegato app, dopo

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

inserisci questo:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)

1
I valori di rosso, verde e blu sono compresi nell'intervallo da 0 a 1. Devi dividerli per 255 o non funzionerà.
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
    }
}

7

Swift 4 Per ViewController specifico senza navigationViewController incorporato, basta aggiungerlo al file ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Se abbiamo un controller di navigazione incorporato, cosa fai?
Icekomo,

7

Un altro modo davvero semplice per farlo funzionare è solo quello di creare un'estensione della classe UINavigationController.

Poiché l'override del preferredStatusBarStyle:metodo non funzionerà A MENO CHE lo facciamo all'interno della classe UINavigationController.

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

4

Avevo impostato il colore specifico (in formato RGB) utilizzando il codice seguente nel App Delegatefile:

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

. . .
}

È inoltre necessario aggiungere la chiave di seguito nel Info.plistfile:

Visualizza l'aspetto della barra di stato basata su controller con valore booleano impostato su NO

Schermata 1

Schermata 2


Con Siwft 3.0, come si fa?
ANCORA

4

Posso suggerirti un modo più semplice,

  1. Chiama setNeedsStatusBarAppearanceUpdate in viewDidLoad come dicono i documenti Apple,

Chiamare questo metodo se gli attributi della barra di stato del controller di visualizzazione, come lo stato o lo stile nascosto / non nascosto, cambiano. Se si chiama questo metodo all'interno di un blocco animazione, le modifiche vengono animate insieme al resto del blocco animazione.

  1. Implementare favoriteStatusBarStyle restituendo il tipo preferito.

Ha funzionato per me in iOS 10.1.

Obiettivo C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

veloce

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Sono sorpreso che nessuno l'abbia sottolineato. Comunque divertiti :)


4

Ho avuto qualche problema con questo. Non mi sentivo davvero bene nel cambiare globalmente il colore della barra di stato in vista appariva e poi cambiarlo di nuovo in vista scompariva come la risposta accettata. Che ci crediate o no, è possibile farlo funzionare sostituendo preferredStatusBarStyleil controller di visualizzazione desiderato. Dopo molto tempo questo è quello che ho fatto per farlo funzionare:

  1. Cambia Visualizza l'aspetto della barra di stato basata sul controller nel tuo info.plist SÌ.
  2. Ora qualsiasi controller di visualizzazione a schermo intero può cambiare lo stile della barra di stato sostituendo preferredStatusBarStyle .
  3. Specifico a schermo intero perché non funzionerà con i controller di visualizzazione modale (non a schermo intero), non senza impostazione modal​Presentation​Captures​Status​Bar​Appearance Sì.
  4. Inoltre, se si dispone di controller di visualizzazione integrati, come ad esempio in un controller di navigazione, verrà richiesto al controller di visualizzazione più in alto lo stile della barra di stato. La sostituzione child​View​Controller​For​Status​Bar​Stylee il passaggio del controller di visualizzazione incorporato dovrebbero funzionare, ma non è stato per me. Quindi ho appena restituito la barra di stato preferita dei controller di visualizzazione incorporata come stile della barra di stato preferita. Qualcosa come questo:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }

Questa risposta mi ha aiutato! Ho scoperto che per qualche motivo il mio controller di navigazione (presentato in modo modale) non stava implicitamente chiedendo al controller della vista più in alto il suo stile nella barra di stato. Quindi ho dovuto subclassareUINavigationController e sovrascrivere il child​View​Controller​For​Status​Bar​Stylevar lì dentro, ritornando self.topViewController.
taber

3

In Swift 4 o 4.2

Puoi aggiungere sul tuo vc

preferredStatusBarStyle

e imposta il valore di ritorno su

.lightContent o .default

ex:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

3

(Dal 10 giugno 2020)

Swift 5 ( senza modifica.Plist file )

Se si utilizza Storyboard, andare su NavigationController, selezionare il navigationBar, fare clic su Attributes Inspector, quindi modificare style. se è necessario light content( barra di stato bianca ) impostarlo su qualsiasi cosa tranne defaultdire stile di impostazione blackE se si desidera dark content ( barra di stato nera ) impostarlodefault .

L'impostazione predefinita ( UIBarStyleDefault) indica la UIStatusBarStyleDefaultbarra di stato in primo piano scuro . E UIBarStyleBlackfornirà una UIStatusBarStyleLightContentbarra di stato.

programatically

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

Senza barra di navigazione ( Modifica.Plist )

aggiungi UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearanceal tuo info.pliste imposta il valore è true.

Overridela preferredStatusBarStyleproprietà nel tuo controller

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

2

Aggiornamento Swift 3.0

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

2

Ciò che ha funzionato con me, nello Storyboard, vai al controller di navigazione, seleziona la barra di navigazione, fai clic su Impostazioni attributi, quindi cambia lo stile da predefinito a nero. Questo è tutto!


2

SWIFT 4.2 Ehi, volevo condividere una soluzione, che ha funzionato per me che ho ottenuto da un grande articolo su questo argomento elusivo di Graig Grummitt.

Passaggio 1 Come altri hanno già detto AGGIUNGI di seguito al tuo PLIST

View controller-based status bar appearance YES

Passaggio 2 nel controller RootView aggiungere di seguito

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
    }

Quando si aggiorna una proprietà statusBarHiddeno vcStatusBarStylechiamerà setNeedsStatusBarAppearanceUpdate()e aggiornerà la barra di stato con i nuovi valori per prefersStatusBarHiddeno preferredStatusBarStyle. Nella mia situazione ho dovuto aggiornare queste proprietà per il container viewcontroller, che era il genitore del childviewcontroller visibile. L'ho fatto usando un semplice metodo delegato.

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

Naturalmente durante l'istanza di childViewController (Visible VC) non dimenticare di impostare MainViewcontroller (Container VC) come suo delegato. A volte lo faccio. :)

childViewController.delegate = self

Quindi in childViewController ho appena chiamato il metodo delegato quando necessario per aggiornare la barra di stato.

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

Come accennato in precedenza, Graig Grummitt approfondisce ulteriormente questa soluzione e lavora anche con UINavigationController. Link qui: Il misterioso caso della barra di stato


1

Fai clic sul gruppo File di supporto (in alto a sinistra - nome del tuo progetto). Vai a Info. Fai clic su + da qualche parte tra gli elenchi, come sotto il nome del pacchetto. E aggiungi "Visualizza l'aspetto della barra di stato basata sul controller" e impostalo su NO. Quindi apri AppDelegate.swift e modifica in questo modo:

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

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

return true
}

Questo è tutto.


Hai letto la domanda in modo sbagliato. Ho chiesto informazioni su come modificare StatusBarStyle per viewcontroller specifici, non per l'applicazione completa.
Anuj,

Controlla la mia risposta qui sotto @Anuj
theCrab il

1

Per Xcode 10 puoi creare una classe e metterla prima della tua classe viewController, puoi chiamare questa classe in tutte le view controller è necessaria una barra di stato del contenuto leggero ...

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

Ora cambia la classe viewController in:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

E questo è tutto...


1

Funziona per la navigazione Basato su un particolare controller di visualizzazione in 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)

1

AVVERTIMENTO


Il setter per 'statusBarStyle' è stato deprecato in iOS 9.0: Usa - [UIViewController preferenzialeStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

quindi la mia soluzione era questa: creare un'estensione dal controller di navigazione:

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

        return .default
    }
}

e se hai un viewController che avrà uno stile diverso da quello dell'app, puoi farlo

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

supponiamo che lo stile dello stato dell'app sia .defaulte desideri che questa schermata sia .lightContent tale che barStyle prenderà .lightContentcome valore predefinito, questo cambierà lo stile della barra di stato in lightContent e quindi assicurati che quando viewWillDisappearcambi di nuovo lo stile della barra nello stile della barra di stato dell'app che nel nostro caso è .default.

questo funziona per me


1

Colore personalizzato per la barra di stato (iOS11 +, Swift4 +)

Se stai cercando una soluzione su come modificare la barra di stato sul tuo colore personalizzato, questa è la soluzione di lavoro.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.