So legen Sie den Statusleistenstil in Swift 3 fest


186

Ich verwende Xcode 8.0 Beta 4.

In der vorherigen Version hat UIViewController eine Methode zum Festlegen des Statusleistenstils

public func preferredStatusBarStyle() -> UIStatusBarStyle

Ich fand jedoch, dass es in Swift 3 in "Get ONLY varaiable" geändert wurde.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Wie kann der Stil für meinen UIViewController bereitgestellt werden?


Versuchen Sie diese var bevorzugteStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Antworten:


484

[AKTUALISIERT] Für Xcode 10+ & Swift 4.2+

Dies ist die bevorzugte Methode für iOS 7 und höher

In Ihrer Anwendung Info.plistsetzt View controller-based status bar appearanceauf YES.

Überschreiben Sie preferredStatusBarStyle ( Apple Docs ) in jedem Ihrer View Controller. Beispielsweise:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Wenn Sie preferredStatusBarStyleeinen anderen bevorzugten Statusleistenstil zurückgegeben haben, der auf Änderungen in Ihrem Ansichts-Controller basiert (z. B. ob die Bildlaufposition oder ein angezeigtes Bild dunkel ist), möchten Sie anrufen, setNeedsStatusBarAppearanceUpdate()wenn sich dieser Status ändert.

iOS vor Version 7, veraltete Methode

Apple hat dies abgelehnt , daher wird es in Zukunft entfernt. Verwenden Sie die oben beschriebene Methode, damit Sie sie bei der Veröffentlichung der nächsten iOS-Version nicht neu schreiben müssen.

Wenn Ihre Anwendung In Ihren Anwendungen unterstützt Info.plist, setzen Sie View controller-based status bar appearanceauf NO.

Fügen Sie appDelegate.swiftin der didFinishLaunchingWithOptionsFunktion Folgendes hinzu:

UIApplication.shared.statusBarStyle = .lightContent

Für den Navigationscontroller

Wenn Sie einen Navigations - Controller verwenden , und Sie wollen der bevorzugte Statusleiste Stil jeden View - Controller verwendet und eingestellt wird , View controller-based status bar appearanceum YESin Ihrer Anwendunginfo.plist

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

3
Funktioniert bei mir. Ich habe vergessen, die neue Einstellung zuerst in Info.plist einzufügen.
Falsecrypt

1
@LightMan der uiapplication statusBarStyle ist nicht veraltet, ich habe dies in iOS 11 verwendet und es funktioniert.
Sushobhit

1
@Sushobhit setStatusBarStyle war in iOS 9 veraltet, wie in dieser Antwort verwendet. Sie haben jedoch weiterhin UIApplication.statusBarStyle als schreibgeschützte Eigenschaft.
LightMan

1
Es gibt Zeiten, in denen Sie es aufgrund der Farbe jeder Ansicht programmgesteuert einstellen möchten.
Alejandro Cavazos

9
Sie können auch die Zeile in appDelegate.swift entfernen und zu Ziel -> Allgemein -> Bereitstellungsinfo -> Statusleistenstil -> Licht
Robert Veringa

162

Letztes Update (Xcode 10+ / Swift 4.2+)

Dieser Artikel ist für alle intakt, die bereit sind, die Logik hinter verschiedenen Ansätzen zu verstehen, die in den letzten Jahren vorhanden waren. Ab Xcode 10 ist der erste Ansatz von Swift 4.2 veraltet und wird nicht mehr unterstützt (dh er wird nicht wirksam, wenn Sie versuchen, ihn zu verwenden). Es wird immer noch zu Ihrer Information verwendet, um die Gründe für die Plist.infoFlaggen- und Anpassungspraxis besser zu verstehen .

Wichtige Klarstellung

Es ist sehr wichtig, zwei Ansätze zum Anpassen des Erscheinungsbilds der Statusleiste zu verstehen. Sie sind unterschiedlich und sollten nicht gemischt werden.

Erster Ansatz - eine Farbe für die gesamte App (seit iOS7 veraltet)

In info.plist finden oder erstellen Sie einen Schlüssel namens

View controller-based status bar appearance

und setzen Sie es auf NEIN .

Was es macht? Im Wesentlichen wird eine Einstellung festgelegt, die besagt, dass in Ihrer Anwendung das Erscheinungsbild der Statusleiste nicht von jedem Ansichts-Controller einzeln definiert wird . Das ist super wichtig zu verstehen. Dies bedeutet, dass Sie für die gesamte App und für alle Bildschirme eine einheitliche Einstellung haben . Es gibt zwei Einstellungen: defaultSchwarzer Text auf weißem Hintergrund oder lightContentWeißer Text auf schwarzem Hintergrund.

So richten Sie eine dieser Einstellungen ein ( eine Einstellung für alle Bildschirme ):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent // .default
    return true
}

Auf diese Weise müssen Sie diese Einstellung nicht auf jedem Ansichts-Controller neu einrichten. Sie können jedoch jederzeit auf diese Methode zurückgreifen, um das Erscheinungsbild freiwillig zu ändern.

Zweiter Ansatz - individuelle Farbe für jeden View Controller

Das ist das Gegenteil. Damit es funktioniert, gehen Sie zu info.plist und legen Sie fest

View controller-based status bar appearance

zu JA

Auf diese Weise wird der Statusleistenstil bei jedem Öffnen eines neuen Ansichtscontrollers individuell festgelegt, wenn Sie diese Implementierung in jeder benötigten UIViewControllerInstanz einfügen :

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

Sie haben den gleichen wie im ersten Schritt, indem Sie für die Statusleiste entweder einen dunklen oder einen hellen Stil festlegen, der für jeden Ansichts-Controller individuell ist.

Diese Eigenschaft wird von UIKit in zwei Szenarien abgerufen:

  1. Bei der Initialisierung des Bildschirms, wenn die Benutzeroberfläche vorbereitet wird.
  2. Beim Aufrufen setNeedsStatusBarAppearanceUpdate()des Codes.

Im letzteren Fall können Sie das Erscheinungsbild der Statusleiste mit dem folgenden Code ändern:

var isDark = false {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return isDark ? .lightContent : .default
}

func toggleAppearance() {
   isDark.toggle()
}

Dann, wann immer Sie anrufen toggleAppearance() wird dann eine Änderung des Statusleistenstils ausgelöst.

Dritter Ansatz - Hack!

Es gibt einen Hack, mit dem Sie direkt auf die Statusleiste zugreifen können:

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
}

Warum hacken? Wenn Sie eine andere Statusleistenfarbe als Schwarz oder Weiß benötigen, verwenden Sie eine undokumentierte API. Sie erhalten ein statusBarObjekt mit KVC und legen dessen Hintergrundfarbe fest. Objekt, das Sie auf diese Weise erhalten, ist das UIStatusBar, das von Eigentum abgeleitet ist UIViewund somit natürlich unterstützt backgroundColor. Dies ist eine schmutzige, nicht legale Methode, aber bisher ist dies die einzige Möglichkeit, eine benutzerdefinierte Farbe für die Statusleiste einzurichten (ohne Berücksichtigung des UINavigationBarAnsatzes, mit dem das Erscheinungsbild der Navigationsleiste und der Statusleiste insgesamt angepasst werden kann). Es kann durchaus dazu führen, dass Ihre App abgelehnt wird. Aber vielleicht hast du Glück. Und wenn Sie dies unter bestimmten komplexen Umständen tun (z. B. in der Hierarchie verschachtelter, untergeordneter Navigations- und Ansichtssteuerungen), ist dies möglicherweise die einzige oder zumindest die weniger problematische Möglichkeit, das Erscheinungsbild der Statusleiste anzupassen (z. B. um es transparent zu machen).

Xcode 10+, Swift 4.2

Es gibt keine Alternativen mehr: Entwickler sollten jedem View Controller erlauben, das Erscheinungsbild der Statusleiste zu definieren, indem er das Flag auf YES setzt (oder diese Aktion weglässt, da es standardmäßig YES ist) und die obigen Anweisungen befolgt .


Bonus

Hack-basierte Lösung, die Sie unter komplexen Umständen verwenden können (obwohl dies nicht empfohlen wird), um das Erscheinungsbild der Statusleiste jederzeit freiwillig zu ändern. In Bezug auf die Farbe macht die folgende Erweiterungsmethode genau das, was Sie mit einem regulären Ansatz hätten tun können. Sie können es an Ihre Bedürfnisse anpassen.

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

2
Sobald Sie die Statusleiste haben, können Sie auch Folgendes tun: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); oder verwenden Sie alle vorhandenen Schlüssel jede Eigenschaft zu setzen , die für UIStatusBar verfügbar ist , aber nicht für UIView
Mark

application.statusBarStyle = .lightContent Dieser Ansatz ist im Allgemeinen, da iOS9> Setter für 'statusBarStyle' in iOS 9.0 veraltet war: Verwenden Sie - [UIViewController bevorzugtStatusBarStyle] Das Warten auf UIViewController
toxicsun

Dies ist das einzige, was hier funktioniert, wenn das Farbthema der App geändert wird. Sobald dies eingestellt wurde, müssen Sie es jedoch immer zurücksetzen, wenn Sie die Ansichtssteuerung wechseln. Die bevorzugteStatusBarStyle () -Methode wird von nun an ignoriert (auch bei richtiger Einstellung in info.plist).
Nichtautomatischer

2
Diese Antwort ist im Vergleich zu anderen aussagekräftiger.
ViruMax

2
Bonus-Lösung ist in iOS 13.1
ViruMax

130

Sie könnten versuchen, den zurückgegebenen Wert zu überschreiben, anstatt ihn festzulegen. Die Methode ist als {get} deklariert. Geben Sie einfach einen Getter an:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Wenn Sie dies bedingt festlegen, müssen Sie anrufen, setNeedsStatusBarAppearanceUpdate()damit die Änderung animiert wird, wenn Sie bereit sind


2
Dies ist ein besserer Ansatz, da Sie prefersStatusBarHiddenfür einige Ihrer Ansichten auswählen können . Wenn Sie UIApplication.shared.statusBarStylemitgehen, bleiben Sie dabei.
Superarts.org

105

Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Für mich funktioniert diese Methode nicht:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

als ich an jeden View Controller gewöhnt war, aber das funktionierte:

  • Fügen Sie in der Datei info.list row: hinzu View controller-based status bar appearanceund setzen Sie aufNO

  • Weiter in appdelegate:

    UIApplication.shared.statusBarStyle = .lightContent

Ich habe es erst versucht, nachdem ich dem App-Delegaten Code hinzugefügt hatte, aber die Einstellung der Info-Liste war für mich hilfreich. Vielen Dank
Akhilesh Sharma

6
Setter für 'statusBarStyle' war in iOS 9.0 veraltet: Verwendung - [UIViewController PreferredStatusBarStyle]
Reimond Hill

33

Wenn Sie die statusBarFarbe des Weiß für alle in a enthaltenen Ansichten in Weiß ändern möchten UINavigationController, fügen Sie Folgendes hinzu AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

Dieser Code:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

funktioniert nicht für UIViewControllersin a enthalten UINavigationController, weil der Compiler nach dem statusBarStylevon sucht UINavigationController, nicht nach dem statusBarStylevon ihm ViewControllersenthaltenen.

Hoffe das hilft denen, die mit der akzeptierten Antwort nicht erfolgreich waren!


Ja danke sehr! Der Navigationscontroller war eine kleine Nuance, die viele nicht berücksichtigten!
Alexis Candelaria

26

Wenn Sie den Statusleistenstil jederzeit nach dem Anzeigen der Ansicht ändern möchten, können Sie Folgendes verwenden:

  • In der Datei info.list Zeile hinzufügen: Zeigen Sie das Erscheinungsbild der Controller-basierten Statusleiste an und setzen Sie sie auf JA

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }

1
UndIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G

25

Sie müssen den folgenden Schlüssel in Ihre Info.plist-Datei einfügen:

View controller-based status bar appearance mit booleschem Wert auf gesetzt NO

In Ihrer Appdelegate-Klasse in didFinishLaunchingWithOptionsMethode vor der Rückgabe.

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

ändern backgroundColorund statusBarStylenach Anforderung.


Gute Lösung, aber zählt dies als Verwendung einer privaten API?
GoldenJoe

Funktioniert gut, aber wie kann ich zu meiner benutzerdefinierten Farbe wechseln?
iSrinivasan27

@ MohanSrinivasan Anstelle von "UIColor.red" können Sie Ihre benutzerdefinierte Farbe angeben.
Himanshu Padia

24

Xcode 10 oder höher

Getestet in Swift 5

Es ist kein Code erforderlich. Befolgen Sie einfach die folgenden Schritte.

Wenn Sie die Statusleiste in der gesamten App ändern möchten.

  1. Wählen Sie im Projektnavigator (linkes Seitenfeld) die Option Projekt.
  2. Ziel auswählen.
  3. Wählen Sie die Registerkarte Allgemein.
  4. Informationen zur Bereitstellung finden.
  5. Ändern Sie den Stil der Statusleiste in Hell (für dunklen Hintergrund "Hell" , Heller Hintergrund "Standard" )

Vergessen Sie nicht die Änderungen an info.plist

  1. Wählen Sie die Registerkarte Info
  2. Fügen Sie diesen Schlüssel in Ihre Plist-Datei ein. "Anzeigen der Controller-basierten Statusleiste" = NEIN

Führen Sie Ihr Projekt aus und überprüfen Sie es.

Mein Projekt in Swift 5 und Xcode 10.2 & 11.0


Für Xcode 10 / Swift5 sollte dies die akzeptierte Antwort sein. Sie müssen BEIDE Schritte ausführen, damit dies funktioniert.
John Robi

Perfekt. Danke dir! Ich bin damit einverstanden, dass dies die tatsächlich akzeptierte Antwort sein sollte.
DungeonDev

Dies ist die perfekte Antwort 🤟🏻
nikhilgohil11

Dies funktioniert auch für Xcode 11 mit Swift 5, danke
Luis Santiago

13

Sie können dies auch im Storyboard tun

  1. Erstellen Sie einen neuen Eintrag in info.plist "Anzeigen der Controller-basierten Statusleiste" und setzen Sie ihn auf "JA".
  2. Gehen Sie zu Ihrem Storyboard und wählen Sie den Navigationscontroller aus, den Sie ändern möchten. Klicken Sie im Abschnitt "Storyboard-Dokumentumriss" (linkes Feld im Storyboard) auf die Navigationsleiste.
  3. Gehen Sie zum rechten Bereich und klicken Sie auf den Abschnitt Attribute
  4. Im Abschnitt Navigationsleiste sehen Sie den Stil. Wählen Sie den gewünschten Stil aus (Standard ist Schwarz und Schwarz Weiß).

Sie müssen dies für jeden Navigationscontroller tun, den Sie haben. Alle Ansichten unter diesem Navigationscontroller ändern jedoch den Stil / die Farbe aller Statusleisten der Ansicht in die gerade ausgewählte. Ich finde diese Option besser, da Sie Ihre Ergebnisse sofort sehen können und nicht in jedem View Controller zusätzliche Codezeilen hinzufügen müssen.

Geben Sie hier die Bildbeschreibung ein

(Fertig mit Xcode 8.3.3 in einem All Swift-Projekt)


"Anzeige Controller-basierte Statusleiste Aussehen" sollte auf "NEIN" gesetzt werden
Willjay

2
Sehr saubere Methode zum Festlegen des Statusleistenstils gemäß dem View Controller-Inhalt. Dies ist die richtige Methode, anstatt View controller-based status bar appearance = NOnur den hellen oder dunklen Stil in der gesamten App festzulegen und verwenden zu müssen. Es ist eine Schande, dass diese "codelose" Methode nur in Navigation Controller funktioniert. Apple sollte in Betracht ziehen, ein weiteres Feld hinzuzufügen, um diese Option in einer View Controller-Instanz festzulegen.
Aldoram5

12

Für Benutzer, die die Statusleiste für alle Viewcontroller unter iOS 11 ändern möchten, ist die Swfit 4/5-Lösung ziemlich einfach.

1) Info.plist hinzufügen:

Anzeigen der Controller-basierten Statusleiste -> NEIN

2) Linke Seite des XCode-Slect-Projekts> Ziele > Wählen Sie Ihr Projekt aus> Unter Allgemein> Bereitstellungsinformationen> Statusleistenstil auswählen : Hell

Wenn Sie die Statusleiste nur für einen Viewcontroller ändern möchten , fügen Sie in viewDidLoad Folgendes hinzu:

2.1 ) Info.plist

Anzeigen der Controller-basierten Statusleiste -> JA

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Objective-C (oder native Reaktion) ändert sich von App Delegate:

1) Info.plist hinzufügen:

Anzeigen der Controller-basierten Statusleiste -> NEIN

2) AppDelegate -> didFinishLaunchingWithOptions

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

Das Ändern der Statusleiste funktioniert nicht beim Versuch, Push (Navigationscontroller) auszuführen, sondern nur beim Präsentieren von modalen Ansichtscontrollern.


8

Im ersten Schritt müssen Sie eine Zeile mit Schlüssel: View controller-based status bar appearanceund Wert NOzur Info.plistDatei hinzufügen . Fügen Sie danach 2 Funktionen in Ihrem Controller hinzu, die nur von diesem Controller ausgeführt werden:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        UIApplication.shared.statusBarStyle = .default    
}

6

Swift 3

Fügen Sie in Info.plist eine Zeile mit dem Namen "Controller-basiertes Erscheinungsbild der Statusleiste anzeigen" hinzu und setzen Sie den Wert auf No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}

6

Beim Umgang mit Navigationsleisten scheint es ein kleines Problem mit der Textfarbe der Statusleiste zu geben.

Wenn Sie möchten, dass der .plist-Eintrag "Controller-basiertes Statusleisten-Erscheinungsbild anzeigen" aktiviert ist, funktioniert YESdies manchmal nicht, wenn Sie eine farbige Navigationsleiste haben.

Beispielsweise:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

und

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

Der obige Code funktioniert auch dann nicht, wenn Sie im AppDelegate Folgendes festgelegt haben:

UIApplication.shared.statusBarStyle = .lightContent

Für diejenigen, die immer noch Probleme haben, wird anscheinend anhand der Stile in der Navigationsleiste beurteilt, ob die Statusleiste hell oder dunkel sein muss. Daher konnte ich dies beheben, indem ich in viewWillAppear die folgende Zeile hinzufügte:

nav?.barStyle = UIBarStyle.black

Wenn der Balkenstil schwarz ist, hört er auf Ihre überschriebene Variable. Hoffe das hilft jemandem :)


5

Xcode 8.3.1, Swift 3.1

  1. Erstellen Sie einen neuen Eintrag in info.plist "Controller-basiertes Erscheinungsbild der Statusleiste anzeigen" und setzen Sie ihn auf "NEIN".

  2. Öffnen Sie AppDelegate.swift und fügen Sie diese Zeilen in die Methode "didFinishLaunchingWithOptions" ein:

application.statusBarStyle = .lightContent


5

Hier finden Sie Apple-Richtlinien / Anweisungen zur Änderung des Statusleistenstils.

Wenn Sie Statusleiste Stil festlegen möchten, Anwendungsebene dann eingestellt , UIViewControllerBasedStatusBarAppearanceum NOin der .plistDatei. Und in Ihrem appdelegate> didFinishLaunchingWithOptionsadd follow ine (programmgesteuert können Sie dies vom App-Delegaten aus tun).

Ziel c

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

Schnell

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

Wenn Sie den Statusleistenstil auf Ansicht des Controllers festlegen möchten, gehen Sie folgendermaßen vor:

  1. Setzen Sie das UIViewControllerBasedStatusBarAppearancein YESin der .plistDatei, wenn Sie den Statusleistenstil nur auf UIViewController-Ebene festlegen müssen.
  2. In der viewDidLoad Add-Funktion - setNeedsStatusBarAppearanceUpdate

  3. Überschreiben Sie den bevorzugten StatusBarStyle in Ihrem Ansichts-Controller.

Ziel c

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Schnell

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Stellen Sie den Wert von .plist entsprechend der Setup-Ebene des Statusleistenstils ein.

Geben Sie hier die Bildbeschreibung ein


5

Hinzufügen zur großen Antwort von @Krunal https://stackoverflow.com/a/49552326/4697535

Wenn Sie a verwenden UINavigationController, preferredStatusBarStylehat dies keine Auswirkungen auf die UIViewController.

Xcode 10 und Swift 4.

Legen Sie eine benutzerdefinierte fest UINavigationController

Beispiel:

class LightNavigationController: UINavigationController {

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

Verwenden Sie eine Erweiterung für eine Lösung auf App-Ebene:

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

4

Swift 4.0 Bitte verwenden Sie diesen Code in der Appdelegate-Klasse "didFinishLaunchingWithOptions launchOptions:"

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
}

4

Swift 4+

für weißen Statusleisten-Text:

navigationController.navigationBar.barStyle = .blackTranslucent

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
}

'blackOpaque' ist nicht verfügbar: Verwenden Sie UIStatusBarStyleLightContent
Makalele

3

Das hat bei mir funktioniert

Setzen Sie das View controller-based status barErscheinungsbild in plist auf NO und fügen Sie dann UIViewController viewDidAppeargerade die folgende Zeile hinzu

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)

setStatusBarStyle ist in iOS 9 veraltet.
Lastmboy

3

schnell 3

Wenn in der Info.plist das Aussehen der Controller-basierten Statusleiste angezeigt wird = JA

Verwenden Sie diese Erweiterung dann für alle NavigationController

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

Wenn es keinen UINavigationController gibt und nur UIViewController hat, verwenden Sie den folgenden Code:

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

2
Funktioniert bei mir nicht Ich erhalte die Fehler "Eigenschaft überschreibt keine Eigenschaft aus ihrer Oberklasse" und "Getter für 'PreferredStatusBarStyle' mit Objective-C-Selektor 'PreferredStatusBarStyle' widerspricht der vorherigen Deklaration mit demselben Objective-C-Selektor".
Theo

Vielen Dank dafür. Nach 20 verschiedenen Versuchen und einigen Kombinationen von Elementen können Sie auf diese Weise die Farbe der Statusleiste festlegen. Ich musste nur daran denken, setNeedsStatusBarAppearanceUpdate () aufzurufen, als ich die Farbe ändern wollte, während ich im Nachtmodus hinzufügte und Schwarz auf Schwarz einfach nicht funktionierte.
Stuart P.

3

Swift 5

Um mehr Details für die Antwort von PRAVEEN unter https://stackoverflow.com/a/40066798/2082851 hinzuzufügen , möchte ich meine Implementierung bereitstellen. Es unterstützt die Flexibilität , die Statusleiste jedes Controllers anzupassen.

Insgesamt werden wir eine erstellen, BaseViewControllerdie die statusBarStyleEigenschaft in jedem Fall behandelt. Wenn Sie einen neuen Controller erstellen, machen Sie ihn als Unterklasse dieses Basis-Controllers.

Wenn Sie das Erscheinungsbild des Status ändern möchten, müssen Sie nur diese Eigenschaft aktualisieren. Der Statusleistenstil wird sofort aktualisiert.

Implementierung

class BaseViewController: UIViewController {

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

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

Demo

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

Geben Sie hier die Bildbeschreibung ein

2. UINavigationController

Denn UINavigationControlleres ist ein Sonderfall, dem Sie beide Lösungen folgen können:

Lösung A: Mit Nachrichtenversand überschreiben

Da UINavigationController ein ist NSObjectund von diesem erbt ObjectiveC, sind seine Methoden message dispatchund Sie können sie überschreiben.

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

Lösung B: UINavigationControllerUnterklasse erstellen

Wenn Sie bereits eine benutzerdefinierte UINavigationControllerLösung haben (die normalerweise mehr Anforderungen steuern muss), ist dies die beste Lösung für Sie.

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

2

Sie können eine bool-Eigenschaft mit dem Namen "shouldStatusBarDark" verwenden, um die Farbe der Statusleiste umzuschalten. Sie können den Wert auch aktualisieren, um die Farbe der Statusleiste beim Scrollen zu ändern.

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

Was ist die navView-Eigenschaft?
Vielen

1
@medskill Das navView ist nur eine Mimik-Navigationsleiste, die programmgesteuert hinzugefügt wurde.
Tiantong

2

Die meisten dieser Antworten sind die gleichen, die erneut gehasht wurden, aber keine von ihnen adressiert tatsächlich den Startbildschirm für mich, wenn ich einen dunklen Hintergrund verwende.

Ich habe dies mit dem folgenden Problem umgangen info.plist, das eine leicht gestaltete Statusleiste hervorbrachte.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

Wenn Sie die Warnung erhalten: Setter für 'statusBarStyle' war in iOS 9.0 veraltet: Verwenden Sie - [UIViewController PreferredStatusBarStyle]. Verwenden Sie den folgenden Code, um die Statusleiste auf hell oder dunkel zu setzen:

//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

Dadurch ändert sich Ihre navBar nicht. Sie zeigt lediglich den Stil an und ändert daher die Statusleiste entsprechend.

NB. Sie müssen sicherstellen, dass Sie in Ihrer info.plist festgelegt haben.

View controller-based status bar appearance to YES

2

Wenn Sie eine modale Präsentation verwenden, müssen Sie Folgendes festlegen:

viewController.modalPresentationCapturesStatusBarAppearance = true

1

In iOS 13 können Sie die .darkContent UIStatusBarStyleEigenschaft verwenden, um die dunkle Statusleiste anzuzeigen


0

Fügen Sie für Ziel C einfach diese Zeile in die didFinishLaunch-Methode Ihrer Anwendung ein

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
Dies ist seit iOS 9
MK_Dev

0

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

}

3
Swift 9.3? Falsches Jahr, Marty
iOS Unit

Ich empfehle, keine private API für das Beispiel "statusBar" zu verwenden. Apple nimmt von Zeit zu Zeit Änderungen an der API vor! Und wenn Apple diese API ändert, stürzt Ihre App möglicherweise ab und die Statusleiste wird nicht mehr geändert. Dadurch können Sie erneut nach einer anderen Lösung suchen.
Doci

0

Wenn Sie den Statusleistenstil basierend auf der Methode immer noch nicht ändern können

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Sie können versuchen, diese Methode zu verwenden:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.