UIStatusBarStyle funktioniert nicht in Swift

85

Ich versuche, die Farbe der Statusleiste in meiner Swift-App in Weiß zu ändern, stoße aber auf eine Mauer. Ich habe 3 ViewController, die jeweils in einen NavigationController eingebettet sind (könnte das das Problem sein? Ich habe bereits versucht, den Code in die NavigationController-Klasse einzufügen.) Ich habe beide folgenden Codeteile in didFinishLaunchingWithOptions meines AppDelegate ausprobiert .swift Datei, aber keine funktioniert.

application.statusBarStyle = .LightContent

und

UIApplication.sharedApplication().statusBarStyle = .LightContent

Alles, was die Docs dazu zu sagen haben, ist, dass UIBarButtonStyle ein Int ist und mir dieses Enum-Snippet gegeben hat, das mir bei der Implementierung überhaupt nicht geholfen hat.

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

Was vermisse ich?

Davidrayowens
quelle

Antworten:

145

Sie haben zwei Möglichkeiten.

Wenn Sie den Stil der Statusleiste weiterhin manuell festlegen möchten, machen Sie weiter, was Sie tun. Sie müssen Ihrer info.plist-Datei jedoch den folgenden Schlüssel mit dem Wert von hinzufügen NO.

Anzeigen der Controller-basierten Statusleiste

Wenn Sie weiterhin das Erscheinungsbild der Statusleiste auf Basis des Ansichtscontrollers verwenden möchten, überschreiben Sie die preferredStatusBarStyleEigenschaft in jedem Ansichtscontroller, für den Sie einen Statusleistenstil angeben möchten, anstatt den statusBarStyle der Anwendung festzulegen .

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Mick MacCallum
quelle
Ich habe diesen Code ausprobiert ... aber ich erhalte nur die weiße Statusleiste im ersten Bildschirm. Ich erhalte keine Statusleiste für den Rest der Bildschirme :( .. Hilfe?
Rahul
7
Sie müssen die Einstellung "Controller-basiertes Erscheinungsbild der Statusleiste anzeigen" in Ihrer Liste auf JA setzen.
StackUnderflow
1
Dies ist nur möglich, wenn Sie ein View Controller-basiertes Erscheinungsbild der Statusleiste verwenden möchten .
Sam Holmes
4
In iOS 10 (Swift 3.0) ist es keine Methode mehr, sondern eine Eigenschaft. Siehe: stackoverflow.com/questions/38862208/…
stevo.mit
nur für einen Bildschirm
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
Maselko
quelle
1
Dies ist die perfekte Antwort :)
Jay Mayu
1
Perfekte Antwort. Kurz und bündig.
Mehul
3
Entschuldigung, dies ist vielleicht die einfachste Antwort, aber es ist definitiv nicht die BESTE: weil es nur diesen einen Stil für alle und alle viewController in der App festlegt. Das Verhalten wurde eingeführt, um eine feinere Steuerung zu ermöglichen und unterschiedliche Einstellungen basierend auf unterschiedlichen Ansichtssteuerungen anzuwenden (z. B. Mischen von hellen und dunklen Inhalten).
Auco
Es ist bizarr - nicht das, was die Apple-Dokumente sagen, aber es funktioniert. Ich habe eine Reihe anderer Möglichkeiten ausprobiert, einschließlich einer UIViewController-basierten Statusleiste. Keine davon hat funktioniert.
n13
33

Sie müssen Folgendes einstellen:

navigationController.navigationBar.barStyle = .black

und der Text wird in weiß angezeigt

Nico S.
quelle
1
Vielen Dank! Es gab nichts half auch diese Überschreibung func preferredStatusBarStyle () -> UIStatusBarStyle {return UIStatusBarStyle.LightContent} , das hilft wirklich: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana
Danken! Du hast meinen Tag gerettet. BlackTranslucent ist jedoch veraltet. Daher habe ich navigationController.navigationBar.barStyle = .Black
hsusmita
Es funktioniert perfekt mit override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Sie müssen nur diese Zeile schreiben, viewDidLoadum gut zu arbeiten. Stellen Sie sicher, dass Sie View controller-based status bar appearance = YESdiese Lösung einhalten .
Bhavin_m
scheint ein Overkill zu sein ... habe es einfach versucht und in der Info.plist-Datei wie folgt funktioniert: 1. Statusleistenstil -> UIStatusBarStyleLightContent 2. Controller-basiertes Statusleisten-Erscheinungsbild
anzeigen
21

Geben Sie für iOS9.x und Xcode7 Folgendes ein AppDelegate.swift:

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

    UINavigationBar.appearance().barStyle = .Black

} 

Dadurch wird der Stil Ihrer Statusleiste .Lightcontentfür alle Ansichts-Controller in einem UINavigationController automatisch geändert.

(Löschen Sie auch View controller-based status bar appearanceaus Info.plist, um die Warnungen zu unterdrücken, die Sie wahrscheinlich auch sehen!)

Biodave
quelle
Danke. Es scheint einen schwerwiegenden Fehler in iOS9 zu geben. Nur so konnte ich die Statusleiste im anfänglichen VC-Weiß drehen. Ich habe alles versucht. Ich werde ein Radar einreichen.
1b0t
PreferredStatusBarStyle gibt UIStatusBarStyleDefault zurück, aktualisiert jedoch nicht den hellen Inhalt auf den dunklen Inhalt für einen bestimmten Ansichtscontroller. Nach self.navigationController.navigationBar.barStyle = UIBarStyleDefault; in viewWillAppear hat für mich gearbeitet. Hoffe, dieser Kommentar wird anderen helfen.
Pandey_Laxman
Beachten Sie, dass der UIStatusBarStyle in Swift 3
brycejl
16

In Swift 3 wurde der Statusleistenstil in eine berechnete Eigenschaft in UIViewController geändert, die Sie wie folgt überschreiben können:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 
Eric Welander
quelle
13

Unter iOS 9 ist Folgendes (setStatusBarStyle) veraltet und Sie erhalten eine Warnung, wenn Sie diesen Weg gehen.

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

Wenn Sie möchten, dass alle Statusleisten in einem einzigen Schuss geändert werden, fügen Sie Ihrer Info.plist Folgendes hinzu. Dadurch wird auch die Statusleiste Ihres Startbildschirms weiß. Während der obige Code nicht wird.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
GuiSoySauce
quelle
Der .plist-Ansatz ist korrekt, aber setStatusBarStyle () ist nicht erforderlich. 'setStatusBarStyle (_: animiert :)' war in iOS 9.0 veraltet: Verwendung - [UIViewController bevorzugteStatusBarStyle]
Bill Chan
@ BillChan danke für den Kommentar, aber bitte lesen Sie die Antwort Gewinn. Ich habe bereits erklärt, dass 'setStatusBarStyle' veraltet ist. Sie sollten PreferredStatusBarStyle verwenden, wenn der eine oder andere viewController geändert werden soll. Der Plist-Ansatz ist für diejenigen gedacht, die alle viewController in einem einzigen Schuss ändern möchten. Hier gibt es kein Richtig oder Falsch. Nur eine Frage dessen, was Sie erreichen müssen.
GuiSoySauce
1
UIStatusBarStyle = UIStatusBarStyleLightContent (in .plist) half beim Start meiner App mit weißem Statusleisten-Text ... Danke !!!
Chris Allinson
10

Für mich funktioniert alles oben nicht, bis ich hinzufüge:

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

so:

  1. Setzen Sie UIViewControllerBasedStatusBarAppearanceauf YESin.plist
  2. In viewDidLoadAnrufself.setNeedsStatusBarAppearanceUpdate();
  3. Überschreiben Sie den bevorzugten StatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. In der überschriebenen Methode setze ich auch das navigationBar.barStyleso endgültige
    für hellen Inhalt:
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    und für schwarzen Inhalt verwenden Sie Standard

Die Quelle von hier und hier .

und wenn dies nicht funktioniert, können Sie versuchen, Folgendes hinzuzufügen UINavigationController extension:

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

        return .default
    }
}
Constantin Saulenco
quelle
1
Kein Kommentar für den Navigationsleistenstil ... aber in Swift 3, Xcode 8 - dies war die einzige Lösung, die für mich funktioniert hat.
Despotovic
Der einzige Nachteil, den ich bemerkt habe, ist, dass es sich mit all diesen Schritten ändert, aber ohne Animation
Lukasz 'Severiaan' Grela
6

Seltsam, mit Swift 3.1 und XC8.2.1, aber all das hat nicht funktioniert.

Was ich getan habe, ist gerecht

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

Keine Plist, kein anderes Zeug. HTH

Lord iPhonius
quelle
Funktioniert auch für Swift 4.2.
Zeeshan
2

In Swift 3.0 können Sie einen Getter in ViewController für das View Controller-basierte Erscheinungsbild der Statusleiste überschreiben:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}
Denis Kreshikhin
quelle
1

Bearbeiten Sie Ihre Info.plist nicht. Fügen Sie dies Ihrem ViewController.swift hinzu:

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

Schritt 1. Zur info.plist hinzufügen View controller-based status bar appearance -> NO

Schritt 2. Fügen Sie Code in die Methode ein, in der Sie die Farbe der Statusleiste ändern müssen:

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

Schlüsselzeile des Codes: setNeedsStatusBarAppearanceUpdate()

Igor
quelle