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?
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.
(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
}
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
UIViewControllerBasedStatusBarAppearance
auf false
.AppDelegate.Swift
, Die didFinishLaunchingWithOptions
enthält, die gewünschte Farbe ein.UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
Swift 3 Update *
UIApplication.shared.statusBarStyle = .lightContent
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)
Es gibt eine Milliarde Antworten, also dachte ich mir, warum nicht noch eine Erweiterung hinzufügen (mit Hilfe von @ Cœur)
extension UIApplication {
class var statusBarBackgroundColor: UIColor? {
get {
return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
} set {
(shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
}
}
}
UIApplication.statusBarBackgroundColor = .blue
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()
}
}
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.
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()
}
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
}
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.
Stars
View Controller ist eine CPBaseNavigationController
und CPBaseNavigationController
ist eine Unterklasse von UINavigationController
.
Ich versuche, die nächsten Setps zu machen:
Fügen Sie in AppDelegate.Swift
func didFinishLaunchingWithOptions
hinzu
//change status bar color
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
aber keine Wirkung.
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.
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.
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 viewDidLoad
UIApplication.sharedApplication().statusBarStyle = .LightContent
und ändern Sie den Standardwert, wenn Sie die Ansicht erhalten, dass viewWillDisappear
verschwunden ist.
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
}
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
}
}
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)
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)
Swift 4 Für bestimmte ViewController ohne eingebettete navigationViewController fügen Sie dies einfach Ihrer ViewController-Datei hinzu.
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
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.
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:
info.plist
in YES.preferredStatusBarStyle
überschreiben.modalPresentationCapturesStatusBarAppearance
auf Ja.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 childViewControllerForStatusBarStyle
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
}
Ich kann Ihnen einen einfacheren Weg vorschlagen,
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.
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 :)
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!
Swift 3.0 Update
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.statusBarStyle = .lightContent
return true
}
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
}
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.
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...
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
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
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
}
}
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.