web-dev-qa-db-de.com

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

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

Verwenden Sie den obigen Code in einem beliebigen ViewController, um die StatusBar-Farbe für einen bestimmten Viewcontroller auf Weiß zu setzen funktioniert nicht in iOS8 für mich. Irgendwelche Vorschläge? Bei Verwendung der UIApplication.sharedApplication-Methode ändert sich die Farbe nach 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 einfach die Farbe der Statusleiste für einige erforderliche und bestimmte ViewControllers ändern?

150
Anuj

Nachdem ich alle Vorschläge gelesen und ein paar Dinge ausprobiert hatte, konnte ich die folgenden Schritte ausführen, um bestimmte Viewcontroller zu verwenden:

Erster Schritt:

Öffnen Sie Ihre info.plist und fügen Sie einen neuen Schlüssel mit dem Namen "Controller-basierte Statusleiste anzeigen" inNO

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

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

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

aber das wirkt sich auf den statusBarStyle aller ViewControllers aus.

So können Sie dies für bestimmte ViewControllers zum Laufen bringen - Abschließender Schritt:

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

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Implementieren Sie außerdem die viewWillDisappear()-Methode für diesen spezifischen 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 zunächst statusBarStyle für den jeweiligen Viewcontroller geändert und anschließend wieder in default, wenn der bestimmte Viewcontroller ausgeblendet wird. Wenn Sie viewWillDisappear() nicht implementieren, wird statusBarStyle dauerhaft in den neuen definierten Wert von UIStatusBarStyle.LightContent geändert.

325
Anuj

(Stand vom 14. November 2018)

Swift 4 , Swift 4.2

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

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 UIViewControllerBasedStatusBarAppearance auf false.
  • Stellen Sie in der ersten Funktion in AppDelegate.Swift, Die didFinishLaunchingWithOptions enthält, die gewünschte Farbe ein.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3 Update *

    UIApplication.shared.statusBarStyle = .lightContent

26
chris_s

In Ihrer Info.plist müssen Sie das Aussehen der View Controller-basierten Statusleiste auf einen beliebigen Wert festlegen.

Wenn Sie es als JA definieren, sollten Sie die bevorzugteStatusBarStyle-Funktion in jedem Ansichtscontroller überschreiben.

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

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

Es gibt eine Milliarde Antworten, also dachte ich mir, warum nicht noch eine Erweiterung hinzufügen (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
14
John R Perry
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()
    }

}
13
A.G

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 Einstellen der Hintergrundfarbe der Statusleiste für bestimmte Ansichtssteuerungen. 

11
Chris Tsitsaris

Swift 2

Ich konnte das Erscheinungsbild des Statusleistenhintergrunds erfolgreich ändern, indem ich Folgendes in meiner AnsichtWillAppear hinzufügte:

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

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
11
A.J. Hernandez

für Swift 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
    }
8
Giang

In meiner Situation verwende ich das Storyboard, um meine Ansichtscontroller zu organisieren. Ich möchte den gesamten Statusleistenstil ändern.

Sie können im Bild unten sehen.

 enter image description here

Stars View Controller ist eine CPBaseNavigationController und CPBaseNavigationController ist eine Unterklasse von UINavigationController.

Ich versuche, die nächsten Setps zu machen:

  1. Fügen Sie in AppDelegate.Swift func didFinishLaunchingWithOptions hinzu 

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

    aber keine Wirkung.

  2. Suchen Sie in StoryBoard den Base Tab BarController (Abbildung oben) .Wählen Sie Attributes Inspector aus, ändern Sie das Sattus Bar-Attribut in Light Content.so schlecht, keine Auswirkung.

 enter image description here

  1. Zuletzt bekomme ich es. In meinem benutzerdefinierten Navigationscontroller CPBaseNavigationController füge func preferredStatusBarStyle hinzu.

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

    Es läuft gut!

Außerdem kann statusBarStyle in 9.0 nicht mehr verwendet werden. Sie können -[UIViewController preferredStatusBarStyle] verwenden.

7
wenghengcong

Implementieren Sie preferredStatusBarStyle wie Sie erwähnt haben und rufen Sie self.setNeedsStatusBarAppearanceUpdate() in ViewDidLoad und Auf, und setzen Sie in Info.plist UIViewControllerBasedStatusBarAppearance auf YES (standardmäßig YES).

Es ist nicht klar, warum es nicht funktioniert. Ich muss den Code überprüfen. Ein anderer Vorschlag lautet Gehen Sie mit dem Arbeitscode in viewDidLoadUIApplication.sharedApplication().statusBarStyle = .LightContent und ändern Sie den Standardwert, wenn Sie die Ansicht erhalten, dass viewWillDisappear verschwunden ist.

7
codester

Swift 4.2 Lösung mit NavigationController

Erster Schritt:

Öffnen Sie Ihre info.plist und fügen Sie einen neuen Schlüssel mit dem Namen "View Controller-based Statusbar-Anzeige" oder UIViewControllerBasedStatusBarAppearance in YES ein, damit jeder VC seine eigene Statuseigenschaft verwenden kann.

Zweiter Schritt  

Überschreiben Sie in jedem VC die Eigenschaft preferredStatusBarStyle 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
}
7
guillama

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

Funktioniert für navigationsbasierte Anwendung

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

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üge das ein: 

UINavigationBar.appearance().barStyle = .black

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

Swift 4 Für bestimmte ViewController ohne eingebettete navigationViewController fügen Sie dies einfach Ihrer ViewController-Datei hinzu. 

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
5
Surjit Singh

Ich hatte eine bestimmte Farbe (im RGB-Format) unter Verwendung des folgenden Codes in der App Delegate-Datei festgelegt:

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 der Info.plist-Datei hinzufügen:

Controller-basierte Statusleiste anzeigen, wobei der boolesche Wert auf NO gesetzt ist.

 Screenshot 1

 Screenshot 2

3

Ich hatte Probleme mit diesem hier. Ich fühlte mich nicht wirklich gut darin, die Farbe der Statusleiste in der Ansicht global zu ändern, und dann wieder zu ändern, verschwand wie die akzeptierte Antwort. Ob Sie es glauben oder nicht, Sie können dies zum Laufen bringen, indem Sie preferredStatusBarStyle in Ihrem gewünschten View-Controller überschreiben. Nach langer Zeit habe ich das getan, um es zum Laufen zu bringen:

  1. Ändern Sie das Aussehen der View Controller-basierten Statusleiste in info.plist in YES.
  2. Jetzt kann jeder Controller für die Vollbildansicht den Statusleistenstil ändern, indem Sie preferredStatusBarStyle überschreiben.
  3. Ich gebe den Vollbildmodus an, da dies nicht für modale Ansichtscontroller (nicht für den Vollbildmodus) funktioniert, nicht ohne Einstellung von modal​Presentation​Captures​Status​Bar​Appearance auf Ja.
  4. Wenn Sie über eingebettete Ansichts-Controller verfügen, wie z. B. in einem Navigations-Controller, wird der oberste View-Controller nach dem Status der Statusleiste gefragt. Das Überschreiben von child​View​Controller​For​Status​Bar​Style und das Übergeben des eingebetteten View-Controllers sollte funktionieren, war aber bei mir nicht der Fall. Also habe ich gerade die bevorzugte Statusleiste des eingebetteten View Controllers als bevorzugten Statusleisten-Stil zurückgegeben. Etwas wie das:

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

Ich kann Ihnen einen einfacheren Weg vorschlagen,

  1. Rufen Sie einfach setNeedsStatusBarAppearanceUpdate in viewDidLoad auf, wie es in den Apple-Dokumenten heißt: 

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

  1. Implementieren Sie preferredStatusBarStyle Ihren bevorzugten Typ zurück.

Es hat für mich in iOS 10.1 funktioniert.

Ziel c

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Swift

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Ich bin überrascht, dass niemand darauf hingewiesen hat. Genieße es trotzdem :)

2
Bhaumik Desai

Was bei mir funktioniert hat, navigieren Sie im Storyboard zum Navigations-Controller, wählen Sie die Navigationsleiste aus, klicken Sie auf den Inspektor Attribute, und ändern Sie den Stil von Standard auf Schwarz. Das ist es!

1
Amr

Swift 3.0 Update

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
1
Jaseibert

In Swift 4 oder 4.2

Sie können auf Ihrem VC hinzufügen

preferredStatusBarStyle

und setze den Rückgabewert auf

.lightContent oder .default

ex:

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

Klicken Sie auf die Gruppe "Unterstützende Dateien" (linker oberster Name Ihres Projekts). Navigieren Sie zu Info. Klicken Sie irgendwo zwischen den Listen auf +, wie unter dem Namen des Pakets. Fügen Sie "Anzeige der Controller-basierten Statusleiste anzeigen" hinzu und setzen Sie die Option auf NO . Ö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.

0

Funktioniert für die Navigation Basiert auf einem bestimmten Ansichtscontroller 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)

Für Xcode 10 können Sie eine Klasse erstellen und vor Ihrer viewController-Klasse einfügen. Sie können diese Klasse in allen View-Controllern aufrufen, die eine Statusleiste mit hellem Inhalt benötigen.

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

Ändern Sie nun Ihre viewController-Klasse in:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

Und das ist alles...

0
Fabio

WARNUNG


Setter für 'statusBarStyle' war in iOS 9.0 veraltet: Use - [UIViewController preferredStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

meine Lösung lautete wie folgt: Eine Erweiterung vom Navigations-Controller aus erstellen:

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 der App hat, können Sie diesen erstellen

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

nehmen wir an, Ihr App-Statusstil ist .default, und Sie möchten, dass dieser Bildschirm .lightContent ist, sodass barStyle den .lightContent als Standardwert verwendet. Dadurch wird der Statusleistenstil in lightContent geändert. Stellen Sie dann sicher, dass viewWillDisappear den barStyle erneut in ändert Stil der App-Statusleiste, in unserem Fall .default.

das funktioniert bei mir

0
hesham ghalaab

Swift 4.2 Hey, ich wollte eine Lösung teilen, die für mich funktionierte, die ich aus einem großartigen Artikel über dieses umfangreiche Thema von Graig Grummitt erhielt.

Schritt 1 Wie andere bereits erwähnt haben, fügen Sie dies 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
    }

Beim Aktualisieren der Eigenschaften statusBarHidden oder vcStatusBarStyle wird setNeedsStatusBarAppearanceUpdate() aufgerufen und die Statusleiste mit den neuen Werten für prefersStatusBarHidden oder preferredStatusBarStyle aktualisiert. In meiner Situation musste ich diese Eigenschaften für den Container-Viewcontroller aktualisieren, der das übergeordnete Element des sichtbaren Childviewcontrollers war. Ich habe dies mit einer einfachen Delegate-Methode gemacht.

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

Wenn Sie den childViewController (Visible VC) instanziieren, vergessen Sie natürlich nicht, den MainViewcontroller (Container VC) als seinen Stellvertreter festzulegen. Mache ich manchmal. :)

childViewController.delegate = self

Dann habe ich im childViewController gerade die Delegate-Methode aufgerufen, wenn dies zum Aktualisieren der Statusleiste erforderlich war.

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

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

0
Erik Uecke

Eine andere sehr einfache Möglichkeit, dies zu erreichen, ist das Erstellen einer Erweiterung der UINavigationController-Klasse.

Da die preferredStatusBarStyle:-Methode überschrieben wird, funktioniert sie nicht, ES SEI DENNinnerhalb der UINavigationController-Klasse.

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

}

0
azemi

Ich habe mich literarisch mit diesem Thema beschäftigt. Ich habe über 4 Stunden gebraucht, um es herauszufinden. Ich habe alle Antworten ausprobiert und das Beste, was ich bekam, war, die Überschrift in die Statusleiste zu bringen. Aber die anderen Teile, wie die Batteriestange und andere, waren immer noch schwarz, was auch immer ich tat: Was alle Lösungen angeht, die in dieser Frage bereitgestellt werden. Also entschied ich mich, meine Schritte zurückzuverfolgen und erfuhr, dass ich eine CocoaPod-Abhängigkeit heruntergeladen hatte, die die normalen Funktionen von Xcode und die Codes zum Ändern der Farben veränderte. Für mich war es "ChameleonFramework" -abhängig. Ich würde daher raten, dass Sie Ihre von CocoaPods installierten Abhängigkeiten überprüfen, indem Sie die neuesten löschen, wenn Sie alle Lösungen angewendet haben und nicht für Sie arbeiten. 

0
Martin Q