UIStatusBarStyle non funziona in Swift


85

Sto cercando di cambiare il colore della barra di stato nella mia app Swift in bianco, ma sto colpendo un muro di mattoni. Ho 3 ViewController ciascuno incorporato in un NavigationController (potrebbe essere questo il problema? Ho già provato a inserire il codice nella classe NavigationController.) Ho provato entrambe le seguenti parti di codice nel didFinishLaunchingWithOptions della mia AppDelegate .swift file ma nessuno dei due ha funzionato.

application.statusBarStyle = .LightContent

e

UIApplication.sharedApplication().statusBarStyle = .LightContent

Tutto ciò che i Docs hanno da dire al riguardo è che UIBarButtonStyle è un Int e mi ha dato questo frammento di enumerazione che non mi ha aiutato affatto con l'implementazione.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

Cosa mi manca?

Risposte:


145

Hai due opzioni.

Se vuoi continuare a impostare manualmente lo stile della barra di stato, continua a fare quello che stai facendo, ma dovrai aggiungere la seguente chiave al tuo file info.plist con un valore di NO.

Visualizza l'aspetto della barra di stato basata su controller

Oppure, se si desidera continuare a utilizzare l'aspetto della barra di stato basato sul controller di visualizzazione, invece di impostare lo statusBarStyle dell'applicazione, sostituire la preferredStatusBarStyleproprietà in ogni controller di visualizzazione per cui si desidera specificare uno stile della barra di stato.

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

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

Ho provato questo codice ... ma ottengo solo la barra di stato bianca nella prima schermata .. Non ricevo la barra di stato per il resto degli schermi :( .. qualche aiuto?
Rahul

7
Devi impostare "Visualizza l'aspetto della barra di stato basata su controller" nel tuo plist su SÌ.
StackUnderflow

1
Questo è solo se si desidera utilizzare un aspetto della barra di stato basato sul controller di visualizzazione.
Sam Holmes

4
in iOS 10 (Swift 3.0) non è più un metodo ma una proprietà. Vedi: stackoverflow.com/questions/38862208/...
stevo.mit

solo per una schermata
Oubaida AlQuraan

143

Swift 3.0

in AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

in AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO

1
Questa è la risposta perfetta :)
Jay Mayu

1
Risposta perfetta. Breve e dolce.
Mehul

3
scusa, questa potrebbe essere la risposta più semplice, ma sicuramente non è la MIGLIORE: perché imposta solo questo stile su tutti i viewController nell'app. Il comportamento è stato introdotto per consentire un controllo più preciso e applicare impostazioni diverse in base a diversi controller di visualizzazione (ad esempio, mescolando contenuti chiari e scuri).
auco

È bizzarro, non quello che dicono i documenti di Apple, ma funziona. Ho provato un sacco di altri modi, incluso avere una barra di stato basata su UIViewController, nessuno di loro ha funzionato.
n13

33

Devi impostare:

navigationController.navigationBar.barStyle = .black

e il testo apparirà in bianco


1
Grazie! Non c'era nulla aiutato anche questo di override func preferredStatusBarStyle () -> UIStatusBarStyle {return UIStatusBarStyle.LightContent} Questo aiuta molto: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana

Grazie! Mi hai salvato la giornata. Tuttavia, BlackTranslucent è deprecato. Quindi, ho usato navigationController.navigationBar.barStyle = .Black
hsusmita

Funziona perfettamente con override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Devi solo scrivere questa riga viewDidLoadper wrok bene. Assicurati di mantenere View controller-based status bar appearance = YESquesta soluzione.
Bhavin_m

sembra eccessivo ... l'ho appena provato e ha funzionato in questo modo nel file Info.plist: 1. Stile barra di stato -> UIStatusBarStyleLightContent 2. Visualizza l'aspetto della barra di stato basato su controller -> NO
raistlin

21

Per iOS9.x e Xcode7, inserisci questo all'interno AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

Questo trasformerà automaticamente lo stile della barra di stato in .Lightcontenttutti i controller di visualizzazione all'interno di un UINavigationController.

(Inoltre, elimina View controller-based status bar appearanceda Info.plist per sopprimere gli avvisi che probabilmente stai vedendo anche tu!)


grazie. Sembra che ci sia un bug serio in iOS9. Questo era l'unico modo in cui potevo trasformare la barra di stato nel VC iniziale bianco. Ho provato di tutto. File un radar.
1b0t

preferredStatusBarStyle restituisce UIStatusBarStyleDefault ma non aggiorna da lightcontent a darkcontent per un viewcontroller specifico. Dopo self.navigationController.navigationBar.barStyle = UIBarStyleDefault; in viewWillAppear ha funzionato per me. Spero che questo commento possa aiutare gli altri.
Pandey_Laxman

Nota che UIStatusBarStyle è stato cambiato in ".black" (B minuscola) in Swift 3
brycejl

16

In Swift 3, lo stile della barra di stato è cambiato in una proprietà calcolata in UIViewController che puoi sovrascrivere in questo modo:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 

13

Su iOS 9 quanto segue (setStatusBarStyle) è deprecato e riceverai un avviso se procedi in questo modo.

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

Se vuoi che tutti gli statusBars cambino in un colpo solo, prova ad aggiungere quanto segue al tuo Info.plist. Questo renderà bianca anche la barra di stato della schermata di avvio. Mentre il codice sopra non lo farà.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

L'approccio .plist è corretto, ma setStatusBarStyle () non è necessario. "setStatusBarStyle (_: animated :)" è stato ritirato in iOS 9.0: utilizzare - [UIViewController preferredStatusBarStyle]
Bill Chan

@ BillChan grazie per il commento, ma per favore leggi il guadagno della risposta. Ho già spiegato che "setStatusBarStyle" era deprecato. È necessario utilizzare preferredStatusBarStyle se si desidera modificare uno o un altro viewController. L'approccio plist è per chi desidera che tutti i viewController vengano modificati in un unico scatto. Non c'è giusto o sbagliato qui. È solo questione di ciò che devi ottenere.
GuiSoySauce

1
UIStatusBarStyle = UIStatusBarStyleLightContent (in .plist) ha aiutato il lancio della mia app con il testo bianco della barra di stato ... Grazie !!!
Chris Allinson

10

per me tutto quanto sopra non funziona finché non aggiungo:

self.navigationController?.navigationBar.barStyle = .black;

così:

  1. Impostato UIViewControllerBasedStatusBarAppearancesu YESin.plist
  2. In viewDidLoadchiamataself.setNeedsStatusBarAppearanceUpdate();
  3. Eseguire l'override di preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. Nel metodo overrided ho impostato anche il navigationBar.barStyleso final
    per i contenuti chiari :
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    e per i contenuti neri usa il default

La fonte da qui e qui .

e se questo non funziona puoi provare ad aggiungere un UINavigationController extension:

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

        return .default
    }
}

1
Nessun commento per lo stile della barra di navigazione ... ma in Swift 3, Xcode 8 - questa era l'unica soluzione che ha funzionato per me.
Despotovic

L'unico inconveniente che ho notato è che con tutti quei passaggi cambia ma senza animazione
Lukasz 'Severiaan' Grela

6

Strano, usando Swift 3.1 e XC8.2.1, ma tutto quanto sopra non ha funzionato.

Quello che ho fatto è giusto

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

Niente Plist, niente altra roba. HTH


Funziona anche per Swift 4.2.
zeeshan

2

In Swift 3.0 puoi sovrascrivere un getter in ViewController per visualizzare l'aspetto della barra di stato basata su controller:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}

1

Non modificare la tua Info.plist. Aggiungi questo al tuo ViewController.swift:

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

1

Passaggio 1. Aggiungi a info.plist View controller-based status bar appearance -> NO

Passaggio 2. Aggiungi il codice nel metodo in cui è necessario modificare il colore della barra di stato:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

Riga di codice chiave: setNeedsStatusBarAppearanceUpdate()

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.