Ändern der Farbe der Statusleiste für bestimmte ViewController mit Swift in iOS8

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

Die Verwendung des obigen Codes in einem ViewController zum Festlegen der StatusBar-Farbe für einen bestimmten Viewcontroller auf Weiß funktioniert in iOS8 für mich nicht . Irgendwelche Vorschläge? Bei Verwendung der UIApplication.sharedApplication-Methode ändert sich die Farbe nach den erforderlichen Änderungen in der Info.plist für die gesamte App.

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

Wie kann ich nur die Farbe der Statusleiste für einige erforderliche und spezifische ViewController ändern ?

Anuj
quelle

Antworten:

348

Nachdem ich alle Vorschläge gelesen und einige Dinge ausprobiert hatte, konnte ich dies mit den folgenden Schritten für bestimmte Viewcontroller zum Laufen bringen:

Erster Schritt:

Öffnen Sie Ihre info.plist und geben Sie einen neuen Schlüssel mit dem Namen " View controller-based status bar display " in NO ein

Zweiter Schritt (Nur eine Erklärung, keine Notwendigkeit, dies umzusetzen):

Normalerweise fügen wir den folgenden Code in die Anwendung ein (_: didFinishLaunchingWithOptions :) -Methode des AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

aber das wirkt sich auf die statusBarStylevon allen Viewcontrollers.

So funktioniert dies für bestimmte ViewController - Letzter Schritt:

Öffnen Sie die Viewcontroller-Datei, in der Sie die ändern möchten, statusBarStyleund geben Sie den folgenden Code ein viewWillAppear():

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Implementieren Sie außerdem die viewWillDisappear()Methode für diesen bestimmten viewController und fügen Sie die folgenden Codezeilen ein:

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
}

In diesem Schritt wird zuerst das statusBarStylefür den bestimmten Ansichtscontroller geändert und dann wieder geändert, defaultwenn der bestimmte Ansichtscontroller verschwindet. Wenn Sie das nicht implementieren, viewWillDisappear()wird das statusBarStyledauerhaft auf den neu definierten Wert von geändertUIStatusBarStyle.LightContent

Anuj
quelle
4
Beachten Sie, dass die Status bar is initially hidden = YESStatusleiste ausgeblendet wird, wenn Sie in der Datei info.plist festlegen, dass "Statussteuerung auf Controller-Basis anzeigen = NEIN" angezeigt wird.
xi.lin
13
Wenn Sie wieder zu " UIStatusBarStyle.DefaultVerwenden" wechseln viewWillDisappear(), sollten Sie es verwenden viewWillAppear(), um es zu initialisieren, anstatt viewDidLoad()... Wenn Sie zu dieser Ansicht zurückkehren, ohne dass sie erneut geladen werden muss, sehen Sie nicht das, was StatusBarStyleSie erwarten.
William GP
7
Für Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz
4
Es ist immer noch nicht klar, wie Sie die Farbe der Statusleiste ändern
DoruChidean
4
Leute
108

(Stand 20. September 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}
BennyTheNerd
quelle
7
Stellen Sie sicher, super.viewWillAppeardass Sie anrufen, wenn Sie diesen Code kopieren und einfügen
Stephen Silber
Bearbeitet, um super.viewWillAppear () einzuschließen. Danke @StephenSilber für den Tipp!
BennyTheNerd
Sie müssen den bevorzugten StatusStyle überschreiben, sonst funktioniert er nicht. Vielen Dank für den Hinweis. +1
Alix
3
Verwenden der UIApplication.shared.statusBarStyle = .lightContentErgebnisse in dieser Compiler-Warnung: Setter für 'statusBarStyle' war in iOS 9.0 veraltet: Verwenden Sie - [UIViewController PreferredStatusBarStyle]
Airowe
3
Setzen Sie in der Info.plist Ihrer Anwendung "Aussehen der Controller-basierten Statusleiste
anzeigen
29

Ich habe dieses Tutorial befolgt und es hat bei mir funktioniert. Ich bin mir jedoch nicht sicher, ob es irgendwelche Einschränkungen gibt.

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

  • Öffnen Sie Ihre info.plist und setzen Sie UIViewControllerBasedStatusBarAppearanceauf false.
  • Stellen Sie in der ersten Funktion in AppDelegate.swift, die enthält didFinishLaunchingWithOptions, die gewünschte Farbe ein.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3 Update *

    UIApplication.shared.statusBarStyle = .lightContent

chris_s
quelle
11
Wie ist das spezifisch für jeden View Controller
Yarneo
4
Genau das gilt für die komplette App, und das ist nicht die Frage.
Anuj
3
Ich verwende iOS 8 Swift und xCode 6.1.1 und nur diese beiden Schritte zu befolgen, funktioniert nicht. Sie müssen auch UIApplication.sharedApplication().statusBarHidden = falsezu AppDelegate hinzufügen.swift didFinishLauchingWithOptions
Ahmad Amin
Dies stellte es für die gesamte Anwendung ein. Informationen zu bestimmten Ansichtssteuerungen finden Sie in der ersten Antwort. Es hat bei mir funktioniert.
Akshar Patel
Der Setter für 'statusBarStyle' war in iOS 9.0 veraltet: Verwendung - [UIViewController PreferredStatusBarStyle]
Oleksandr
29

Schnelle 4.2-Lösung mit NavigationController

Erster Schritt:

Öffnen Sie Ihre info.plist und legen Sie einen neuen Schlüssel mit dem Namen „ View - Controller-basierte Statusleiste Aussehen “ oder UIViewControllerBasedStatusBarAppearanceauf YES jeder VC zu lassen ihren eigenen Status - Eigenschaft verwenden.

Zweiter Schritt

Überschreiben Sie in jedem VC die PreferredStatusBarStyle- Eigenschaft wie folgt:

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

Letzter Schritt

Überschreiben Sie die PreferredStatusBarStyle- Eigenschaft in Ihrer benutzerdefinierten NavigationController-Klasse:

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
quelle
Nur so können Sie mit Navigation Controller und Ihren eigenen Controllern das erwartete Ergebnis erzielen. Sie können dies auch für prefersStatusBarHidden tun, wie ich es für mein Projekt getan habe :)
atereshkov
22

Es gibt hier eine Milliarde Antworten, also dachte ich mir, warum ich nicht eine weitere in Form einer Erweiterung hinzufügen sollte (mit Hilfe von @ Cœur).

Swift 3

Erweiterung:

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

Implementierung:

UIApplication.statusBarBackgroundColor = .blue
John R Perry
quelle
2
Bitte beachten Sie, dass dieser Ansatz als Zugriff auf eine private API in Betracht gezogen werden kann und möglicherweise bedeutet, dass Ihre App von Apple abgelehnt wird.
JWhitey
Zumindest hängt es von den Implementierungsdetails von Apple ab und kann bei Änderungen in iOS ohne Vorwarnung unterbrochen werden.
Chris Prince
19

In Ihrer Info.plist müssen Sie das Erscheinungsbild der View Controller-basierten Statusleiste für einen beliebigen Wert definieren.

Wenn Sie es mit JA definieren, sollten Sie die Funktion selectedStatusBarStyle in jedem Ansichts-Controller überschreiben.

Wenn Sie NO definieren, können Sie den Stil in AppDelegate mit festlegen

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Nikita Khandelwal
quelle
7
setStatusBarStylewurde in iOS 9.0
Jeffrey Neo
@ Jeffrey_Neo Obwohl das stimmt, kann ich den Ersatz nicht zum Laufen bringen. Es wäre nützlich, Ihren Kommentar als Antwort mit Arbeitscode zu sehen.
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
quelle
Die Verwendung entspricht valueForKey("statusBar")möglicherweise nicht den Apple-Richtlinien
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
} 

Dies ist die Lösung zum Festlegen der Hintergrundfarbe der Statusleiste für einen bestimmten Ansichts-Controller.

Chris Tsitsaris
quelle
3
UIView reagiert in Swift immer auf backgroundColor.
Cœur
13

SWIFT 2

Ich konnte das Erscheinungsbild des Hintergrunds der Statusleiste erfolgreich ändern, indem ich Folgendes in mein viewWillAppear eingefügt habe:

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

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
AJ Hernandez
quelle
10

Implementieren preferredStatusBarStyleSie wie erwähnt und rufen Sie self.setNeedsStatusBarAppearanceUpdate()auf ViewDidLoadund setzen Sie die Info.plist UIViewControllerBasedStatusBarAppearanceauf YES( YESStandardmäßig)

Es ist nicht klar, warum es nicht funktioniert. Ich muss den Code überprüfen. Ein anderer Vorschlag ist, den Arbeitscode zu verwenden viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContentund diesen auf den Standardwert zu ändern, wenn Sie die Ansicht verschwinden lassen viewWillDisappear.

Codester
quelle
Nur den ersten Teil der Antwort zu implementieren, hat für mich funktioniert. Ich habe jedoch die UIViewcontrollerBasedStatusBarAppearance nicht in die Info.plist aufgenommen. Es hat immer noch funktioniert.
Akshar Patel
10

für schnell 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
quelle
1
Ich habe alle Lösungen ausprobiert ... das hat nur bei mir funktioniert !! Ich weiß nicht warum: D
Khaled Hayek
Glück der Auslosung
Giang
Setter für 'isStatusBarHidden' war in iOS 9.0 veraltet: Verwendung - [UIViewController bevorzugtStatusBarHidden] ...
zeichnete ..
9

In meiner Situation verwende ich das Storyboard, um meine Ansichts-Controller zu organisieren. Ich möchte den Status aller Statusleisten ändern.

Sie können im Bild unten sehen.

Geben Sie hier die Bildbeschreibung ein

StarsView - Controller ist ein CPBaseNavigationControllerund CPBaseNavigationControllerist Unterklasse von UINavigationController.

Ich versuche die nächsten Setps zu machen:

  1. AppDelegate.swiftFügen Sie in func didFinishLaunchingWithOptionshinzu

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

    aber keine Wirkung.

  2. Suchen Sie in StoryBoard die Auswahl Base Tab BarController(Bild oben) Attributes Inspector. Ändern Sie das Sattus BarAttribut in Light Content.so schlecht, keine Auswirkung.

Geben Sie hier die Bildbeschreibung ein

  1. Zuletzt bekomme ich es. Fügen Sie in meinem benutzerdefinierten Navigationscontroller func CPBaseNavigationControllerhinzupreferredStatusBarStyle

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

    Es funktioniert gut!

Außerdem statusBarStylein 9.0 veraltet, können Sie verwenden -[UIViewController preferredStatusBarStyle].

wenghengcong
quelle
9

Funktioniert für navigationsbasierte Anwendungen

    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
quelle
Wo man diesen spezifischen Code hinzufügt, konnte dies einfach nicht zum Laufen bringen.
Anuj
Sie können es in der App-Delegatendatei in didFinishLaunchingWithOptions
Jio
1
Wäre es nicht besser, addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) anstelle der fest codierten Breite 320 zu verwenden?
Torsten Ojaperv
Bearbeitet @TorstenOjaperv
Jio
Wie geht das mit Swift 3.0?
YETI
8

In Swift 3.0 Xcode 8 ist alles viel einfacher

Verwenden Sie anschließend den folgenden Code in der App Delegate-Datei

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

Fügen Sie Folgendes ein:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Anton Russland
quelle
1
Die Werte für Rot, Grün und Blau liegen im Bereich von 0 bis 1. Sie müssen sie durch 255 teilen, sonst funktioniert es nicht.
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
    }
}
die Krabbe
quelle
7

Swift 4 Für einen bestimmten ViewController ohne eingebetteten NavigationViewController fügen Sie diesen einfach Ihrer ViewController-Datei hinzu.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
Surjit Singh
quelle
Was tun Sie, wenn ein Navigationscontroller eingebettet ist?
icekomo
7

Eine andere wirklich einfache Möglichkeit, diese Arbeit zu erledigen, besteht darin, eine Erweiterung der UINavigationController-Klasse zu erstellen.

Da das Überschreiben der preferredStatusBarStyle:Methode NICHT funktioniert, es sei denn, wir tun dies innerhalb der UINavigationController-Klasse.

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

Ich hatte eine bestimmte Farbe (im RGB-Format) mit dem folgenden Code in der App DelegateDatei eingestellt:

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

. . .
}

Sie müssen auch den folgenden Schlüssel in die Info.plistDatei einfügen:

Anzeigen des Controller-basierten Statusleisten-Erscheinungsbilds mit dem auf NO eingestellten Booleschen Wert

Screenshot 1

Screenshot 2

Jayprakash Dubey
quelle
Wie geht das mit Siwft 3.0?
YETI
4

Ich kann Ihnen einen einfacheren Weg vorschlagen,

  1. Rufen Sie einfach setNeedsStatusBarAppearanceUpdate in viewDidLoad auf, wie in den Apple-Dokumenten angegeben.

Rufen Sie diese Methode auf, wenn sich die Statusleistenattribute des Ansichtscontrollers ändern, z. B. ausgeblendeter / nicht ausgeblendeter Status oder Stil. Wenn Sie diese Methode innerhalb eines Animationsblocks aufrufen, werden die Änderungen zusammen mit dem Rest des Animationsblocks animiert.

  1. Implementieren Sie PreferredStatusBarStyle und geben Sie Ihren bevorzugten Typ zurück.

Es hat bei mir in iOS 10.1 funktioniert.

Ziel c

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Schnell

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Ich bin überrascht, dass niemand darauf hingewiesen hat. Wie auch immer, viel Spaß :)

Bhaumik Desai
quelle
4

Ich hatte einige Probleme mit diesem. Ich habe mich nicht wirklich gut gefühlt, wenn ich die Farbe der Statusleiste in der Ansicht global geändert habe und sie dann wieder in der Ansicht geändert habe, ist wie die akzeptierte Antwort verschwunden. Ob Sie es glauben oder nicht, Sie können dies zum Laufen bringen, indem preferredStatusBarStyleSie den gewünschten Ansichts-Controller überschreiben . Nach langer Zeit habe ich Folgendes getan, um es zum Laufen zu bringen:

  1. Ändern Sie das Erscheinungsbild der Controller-basierten Statusleiste in Ihrer info.plistAnsicht in JA.
  2. Jetzt kann jeder Vollbild-Ansichts-Controller den Statusleistenstil durch Überschreiben ändern preferredStatusBarStyle.
  3. Ich gebe Vollbild an, da dies für (Nicht-Vollbild-) Modal View Controller nicht funktioniert, nicht ohne die Einstellung modal​Presentation​Captures​Status​Bar​AppearanceJa.
  4. Auch wenn Sie eingebettete Ansichts-Controller haben, wie beispielsweise in einem Navigations-Controller, wird der oberste Ansichts-Controller nach dem Stil der Statusleiste gefragt. Das Überschreiben child​View​Controller​For​Status​Bar​Styleund Übergeben des Embedded View Controllers sollte funktionieren, hat es aber nicht für mich getan. Daher habe ich gerade die bevorzugte Statusleiste des Embedded View Controllers als bevorzugten Statusleistenstil zurückgegeben. Etwas wie das:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
John C.
quelle
Diese Antwort hat mir geholfen! Ich stellte fest, dass mein Navigationscontroller (der modal dargestellt wurde) aus irgendeinem Grund den obersten Ansichtscontroller nicht implizit nach seinem Statusleistenstil fragte. Also musste ich UINavigationControllerdie child​View​Controller​For​Status​Bar​StyleVar dort unterordnen und überschreiben und zurückkehren self.topViewController.
Taber
3

In Swift 4 oder 4.2

Sie können auf Ihrem VC hinzufügen

PreferredStatusBarStyle

und setzen Sie den Rückgabewert auf

.lightContent oder .default

Ex:

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

(Stand 10. Juni 2020)

Swift 5 ( ohne .PlistDatei zu bearbeiten )

Wenn Sie verwenden Storyboard, gehen Sie zu NavigationController, wählen Sie die aus navigationBar, klicken Sie auf Attributes Inspectorund ändern Sie die style. Wenn Sie möchten light content( weiße Statusleiste ), stellen Sie alles ein, außer beispielsweise defaultden Stil festlegenblack möchten Und wenn Sie möchten dark content ( schwarze Statusleiste ), stellen Sie es ein default.

Das default ( UIBarStyleDefault) führt zum dunklen VordergrundUIStatusBarStyleDefault . Und UIBarStyleBlackgibt eine UIStatusBarStyleLightContentStatusleiste.

Programmatisch

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

Ohne Navigationsleiste ( Bearbeiten.Plist )

add UIViewControllerBasedStatusBarAppearance/View controller-based status bar appearance zu deinem info.plistund setze Wert ist true.

Overridedie preferredStatusBarStyleEigenschaft in Ihrem Controller

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

Swift 3.0 Update

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
Jaseibert
quelle
2

Was mit mir funktioniert hat, gehen Sie im Storyboard zum Navigationscontroller, wählen Sie die Navigationsleiste aus, klicken Sie auf den Attributinspektor und ändern Sie den Stil von Standard auf Schwarz. Das ist es!

Amr
quelle
2

SWIFT 4.2 Hey, ich wollte eine Lösung teilen, die für mich funktioniert hat und die ich aus einem großartigen Artikel zu diesem ellusiven Thema von Graig Grummitt erhalten habe.

Schritt 1 Wie andere bereits erwähnt haben, fügen Sie unten zu Ihrer PLIST hinzu

View controller-based status bar appearance YES

Schritt 2 im RootViewcontroller unten hinzufügen

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
    }

Wenn entweder Eigenschaft zu aktualisieren statusBarHiddenoder vcStatusBarStylesie rufen setNeedsStatusBarAppearanceUpdate()und die Statusleiste mit den neuen Werten für entweder aktualisieren prefersStatusBarHiddenoder preferredStatusBarStyle. In meiner Situation musste ich diese Eigenschaften für den Container-Viewcontroller aktualisieren, der das übergeordnete Element des sichtbaren untergeordneten Viewcontrollers war. Ich habe dies mit einer einfachen Delegatenmethode gemacht.

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

Vergessen Sie natürlich nicht, beim Instanziieren des childViewControllers (Visible VC) den MainViewcontroller (Container VC) als seinen Delegaten festzulegen. Das mache ich manchmal. :) :)

childViewController.delegate = self

Dann habe ich im childViewController bei Bedarf die Delegate-Methode aufgerufen, um die Statusleiste zu aktualisieren.

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

Wie oben erwähnt, geht Graig Grummitt detaillierter auf diese Lösung ein und arbeitet auch mit UINavigationControllern. Link hier: Der mysteriöse Fall der Statusleiste

Erik Uecke
quelle
1

Klicken Sie auf die Gruppe Unterstützende Dateien (linker oberer Name Ihres Projekts). Navigieren Sie zu Info. Klicken Sie irgendwo zwischen den Listen auf +, wie unter dem Namen des Bundles. Fügen Sie "Anzeigen der Controller-basierten Statusleiste" hinzu und setzen Sie sie auf NEIN. Öffnen Sie dann AppDelegate.swift und ändern Sie es wie folgt:

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

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

return true
}

Das ist es.

Goran Jakovljevic
quelle
Sie haben die Frage falsch gelesen. Ich habe gefragt, wie der StatusBarStyle für bestimmte Viewcontroller geändert werden soll, nicht für die gesamte Anwendung.
Anuj
Überprüfen Sie meine Antwort unten @Anuj
theCrab
1

Für Xcode 10 können Sie eine Klasse erstellen und vor Ihre viewController-Klasse stellen. Sie können diese Klasse in allen View Controllern aufrufen, für die eine leichte Inhaltsstatusleiste benötigt wird.

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

Ändern Sie nun Ihre viewController-Klasse in:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

Und das ist alles...

Fabio
quelle
1

Funktioniert für die Navigation Basierend auf einem bestimmten Ansichts-Controller 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)
Gangireddy Rami Reddy
quelle
1

WARNUNG


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

UIApplication.shared.statusBarStyle = .default

Meine Lösung lautete also wie folgt: Erweiterung des Navigationscontrollers:

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

        return .default
    }
}

und wenn Sie einen viewController haben, der einen anderen Stil als den Stil der App hat, können Sie dies vornehmen

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

Nehmen wir an, Ihr App- Statusstil ist .defaultund Sie möchten, dass dieser Bildschirm so ist, .lightContentdass barStyle den .lightContentStandardwert verwendet. Dadurch wird der Statusleistenstil in lightContent geändert und dann sichergestellt, wannviewWillDisappear geändert. Stellen Sie den barStyle erneut in den App-Statusleistenstil ändern was in unserem Fall ist .default.

Das funktioniert bei mir

Hesham Ghalaab
quelle
1

Benutzerdefinierte Farbe für die Statusleiste (iOS11 +, Swift4 +)

Wenn Sie nach einer Lösung suchen, wie Sie die Statusleiste in Ihre benutzerdefinierte Farbe ändern können, ist dies die funktionierende Lösung.

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
quelle