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 bereitgestellt werden, der in meinem UIViewController verwendet werden kann?
Dies ist die bevorzugte Methode für iOS 7 und höher.
Setzen Sie in Info.plist
Ihrer Anwendung die Option "Controller-basierte Statusleiste anzeigen" auf YES.
Überschreibe preferredStatusBarStyle
in jedem deiner View-Controller . Zum Beispiel:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Wenn preferredStatusBarStyle
einen anderen bevorzugten Statusleistenstil zurückgibt, der auf etwas basiert, das sich innerhalb Ihres View-Controllers ändert (z. B. ob die Bildlaufposition oder ein angezeigtes Bild dunkel ist), möchten Sie setNeedsStatusBarAppearanceUpdate()
aufrufen, wenn sich dieser Zustand ändert.
Wenn Sie einen Navigationscontroller verwenden und den bevorzugten Statusleistenstil jedes Ansichtscontrollers verwenden möchten, finden Sie weitere Informationen unter https://stackoverflow.com/a/41026726/1589422 .
iOS vor Version 7, veraltete Methode
Apple hat dies veraltet , daher wird es in Zukunft entfernt. Verwenden Sie die obige Methode, damit Sie sie nicht erneut schreiben müssen, wenn die nächste iOS-Version veröffentlicht wird.
Wenn Ihre Anwendung unterstützt wird In Info.plist
Ihrer Anwendung setzen Sie "Anzeige der Controller-basierten Statusleiste anzeigen" auf NEIN.
Fügen Sie in appDelegate.Swift
, der didFinishLaunchingWithOptions
-Funktion Folgendes hinzu:
UIApplication.shared.statusBarStyle = .lightContent
Sie können 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 setNeedsStatusBarAppearanceUpdate()
aufrufen, damit die Änderung animiert wird, wenn Sie bereit sind
Dieser Artikel ist für alle unangetastet, die die Logik der verschiedenen Ansätze der vergangenen Jahre verstehen möchten. Inzwischen ist ab Xcode 10, Swift 4.2erste Annäherung veraltet und wird nicht mehr unterstützt (dh wird nicht, wenn Sie dies versuchen beschäftige es). Es wird immer noch zu Ihrer Information herangezogen, um die Gründe für Plist.info
-Flag und die Anpassungspraxis besser zu verstehen.
Es ist sehr wichtig, zwei Ansätze zum Anpassen der Darstellung der Statusleiste zu kennen. Sie sind verschieden und sollten nicht gemischt werden.
In info.plist finden Sie einen Schlüssel oder erstellen diesen
View controller-based status bar appearance
und setzen Sie es auf NO.
Was es macht? Im Wesentlichen wird eine Einstellung festgelegt, die besagt, dass in Ihrer Anwendung die Statusleiste wird nicht von jedem Ansichtscontroller individuell definiert wird. Das ist sehr wichtig zu verstehen. Dies bedeutet, dass Sie für die gesamte App eine einheitliche Einstellung für alle Bildschirme haben. Es gibt zwei Einstellungen: default
(schwarzer Text auf weißem Hintergrund) oder lightContent
(weiß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 für jeden Ansichts-Controller erneut vornehmen. Sie können jedoch immer auf diese Methode zurückgreifen, um das Aussehen freiwillig zu ändern.
Das ist das Gegenteil. Damit es funktioniert, fahren Sie mit info.plist fort und setzen Sie die Einstellungen
View controller-based status bar appearance
zu JA
Wenn ein neuer View-Controller geöffnet wird, wird der Statusleistenstil individuell festgelegt, wenn Sie diese Implementierung in jede UIViewController
-Instanz einfügen, die Sie benötigen:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
Sie haben dasselbe wie im ersten Modus. Sie können entweder einen dunklen oder einen hellen Stil für die Statusleiste festlegen, und zwar für jeden Ansichts-Controller.
Es gibt einen Hack, mit dem direkt auf die Statusleiste zugegriffen werden kann:
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 Statusleiste als Schwarz oder Weiß benötigen, verwenden Sie eine undokumentierte API. Sie erhalten ein statusBar
-Objekt mit KVC und legen die Hintergrundfarbe fest. Das Objekt, das Sie auf diese Weise erhalten, ist UIStatusBar
, das von UIView
abgeleitet ist und daher natürlich die backgroundColor
-Eigenschaft unterstützt. Dies ist ein schmutziger, nicht legaler Weg, aber bisher ist dies die einzige Möglichkeit, eine benutzerdefinierte Farbe für die Statusleiste einzurichten (wobei der UINavigationBar
-Ansatz nicht berücksichtigt wird, wodurch die Darstellung der Navbar + Statusleiste insgesamt angepasst werden kann). Dies kann dazu führen, dass Ihre App abgelehnt wird. Aber vielleicht hast du Glück. Wenn Sie sich jedoch in bestimmten komplexen Situationen befinden (z. B. Hierarchie verschachtelter, untergeordneter Navigations- und Ansichtscontroller), ist dies möglicherweise die einzige oder zumindest die weniger problematische Möglichkeit, das Aussehen der Statusleiste anzupassen (beispielsweise, um sie transparent zu machen).
Xcode 10+, Swift 4.2
Es gibt keine Alternativen mehr: Der Entwickler sollte each view controller das Aussehen der Statusleiste definieren, indem er das Flag auf YES setzt (oder diese Aktion weglässt, da es standardmäßig YES ist) und Befolgen Sie die obigen Anweisungen.
Bonus
Hack-basierte Lösung, die Sie (wenn auch nicht empfohlen) in komplexen Situationen verwenden möchten, um das Statusbar-Erscheinungsbild jederzeit freiwillig zu ändern. Farblich gesehen 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")
}
}
}
Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Für mich funktioniert diese Methode nicht:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
wenn ich an jeden View Controller gewöhnt bin, aber das hat funktioniert:
Fügen Sie in der Datei info.list die Zeile: View controller-based status bar appearance
hinzu und setzen Sie sie auf NO
.
Nächstes in appdelegate:
UIApplication.shared.statusBarStyle = .lightContent
Sie müssen den folgenden Schlüssel in Ihrer Info.plist-Datei hinzufügen:
View controller-based status bar appearance
mit booleschem Wert aufNO
In Ihrer appdelegate-Klasse vor der Rückgabe in der didFinishLaunchingWithOptions
-Methode.
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 Sie backgroundColor
und statusBarStyle
je nach Anforderung.
Wenn Sie die Farbe der statusBar
in Weiß ändern möchten, fügen Sie für alle in einer UINavigationController
enthaltenen Ansichten diese in AppDelegate
hinzu:
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
}
nicht arbeitet für UIViewControllers
, die in einer UINavigationController
enthalten sind, da der Compiler nach der statusBarStyle
der UINavigationController
sucht, nicht nach der statusBarStyle
der darin enthaltenen ViewControllers
.
Hoffe, das hilft denen, die mit der akzeptierten Antwort nicht erfolgreich waren!
Wenn Sie die Statusleiste nach dem Anzeigen der Ansicht jederzeit ändern möchten, können Sie Folgendes verwenden:
Fügen Sie in der Datei info.list die Zeile hinzu: Anzeige der Controller-basierten Statusleiste und setzen Sie sie aufYES
var viewIsDark = Bool()
func makeViewDark() {
viewIsDark = true
setNeedsStatusBarAppearanceUpdate()
}
func makeViewLight() {
viewIsDark = false
setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
if viewIsDark {
return .lightContent
} else {
return .default
}
}
Sie können dies auch im Storyboard tun
Sie müssen dies für jeden Navigations-Controller tun, den Sie haben. Alle Ansichten unter diesem Navigationscontroller ändern jedoch den Stil/die Farbe der Statusleisten in der Ansicht in den gerade ausgewählten Bereich. Ich finde diese Option besser, weil Sie Ihre Ergebnisse sofort sehen können und nicht in jedem Ansichts-Controller zusätzliche Codezeilen hinzufügen müssen.
(Erledigt mit Xcode 8.3.3 in einem Alles-Swift-Projekt)
Als ersten Schritt müssen Sie eine Zeile mit dem Schlüssel hinzufügen: View controller-based status bar appearance
und dem Wert NO
zur Info.plist
-Datei. Fügen Sie anschließend zwei Funktionen in Ihrem Controller hinzu, die nur den Controller betreffen:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = .lightContent
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = .default
}
Swift 3
Fügen Sie in Info.plist eine Zeile mit dem Namen "Darstellung der Controller-Statusleiste anzeigen" hinzu, und legen Sie deren Wert auf No
fest.
class YourViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarStyle = .lightContent //or .default
setNeedsStatusBarAppearanceUpdate()
}
}
Es scheint ein kleines Problem bezüglich der Textfarbe der Statusleiste bei Navigationsleisten zu geben.
Wenn Sie möchten, dass der Eintrag .plist View-Controller-basierte Statusleiste auf YES
gesetzt wird, funktioniert er manchmal nicht, wenn Sie eine farbige Navigationsleiste haben.
Zum Beispiel:
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 nicht, auch wenn Sie Folgendes in AppDelegate festgelegt haben:
UIApplication.shared.statusBarStyle = .lightContent
Für diejenigen, die immer noch Probleme haben, beurteilt es offenbar irgendwie, ob die Statusleiste durch die Stile in der Navigationsleiste hell oder dunkel sein muss. So konnte ich das Problem beheben, indem ich in viewWillAppear die folgende Zeile hinzufügte:
nav?.barStyle = UIBarStyle.black
Wenn der Balkenstil schwarz ist, wird Ihre überschriebene Variable abgehört. Hoffe das hilft jemandem :)
Xcode 8.3.1, Swift 3.1
Erstellen Sie einen neuen Eintrag in der Datei "info.plist". "Controller-basierte Statusleiste anzeigen" auf "NEIN" setzen.
Öffnen Sie AppDelegate.Swift und fügen Sie diese Zeilen in der Methode "didFinishLaunchingWithOptions" hinzu:
application.statusBarStyle = .lightContent
Swift 4.0 Verwenden Sie diesen Code in der 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
}
Hier ist Apple-Richtlinien/Anweisungen über den Statusleistenstil.
Wenn Sie den Statusleistenstil, die Anwendungsebene festlegen möchten, setzen Sie UIViewControllerBasedStatusBarAppearance
in der .plist
-Datei auf NO
. Und in Ihrem appdelegate
> didFinishLaunchingWithOptions
folgendes Ine hinzufügen (programmgesteuert können Sie dies vom App-Delegaten aus tun).
Ziel c
[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
Swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent
return true
}
wenn Sie den Statusleistenstil festlegen möchten, führen Sie auf Ansichtssteuerungsebene die folgenden Schritte aus:
UIViewControllerBasedStatusBarAppearance
in der .plist
-Datei auf YES
, wenn Sie den Statusleistenstil nur auf UIViewController-Ebene festlegen müssen. In der ViewDidLoad-Add-Funktion - setNeedsStatusBarAppearanceUpdate
Überschreiben Sie preferredStatusBarStyle in Ihrem View-Controller.
Ziel c
- (void)viewDidLoad
{
[super viewDidLoad];
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Swift
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Legen Sie den Wert für .plist gemäß der Einstellungsebene für die Statusleiste fest.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Das hat für mich funktioniert :) Ich habe einen Navigations-Controller in meine Ansichts-Controller mit ausgeblendeter Navigationsleiste integriert. Ich wollte die Statusleiste für einige Ansichten in der App aktivieren.
Swift 3
wenn Ansicht Controller-basierte Statusleiste in Info.plist = YES
verwenden Sie dann diese Erweiterung für alle NavigationController
extension UINavigationController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
wenn kein UINavigationController vorhanden ist und nur UIViewController vorhanden ist, dann folgenden Code verwenden:
extension UIViewController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Das hat bei mir funktioniert
Setzen Sie View controller-based status bar
Erscheinung inNOin plist und fügen Sie in UIViewController
viewDidAppear
die folgende Zeile hinzu
UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Für Benutzer, die die Statusleiste für alle Viewcontroller auf: iOS 11 ändern möchten, ist die Swfit 4-Lösung ziemlich einfach.
1) Info.plist hinzufügen:
Anzeige der Controller-basierten Statusleiste -> NO
2) Linke Seite des XCode-Slect-Projekts> Ziele > Wählen Sie Ihr Projekt> Unter Allgemein> Informationen zur Bereitstellung> Statusleistenstil auswählen: Licht
Wenn Sie die Statusleiste nur für one viewcontroller ändern möchten, fügen Sie bei viewDidLoad Folgendes hinzu:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Swift 4+
für weißen Statusleistentext:
navigationController.navigationBar.barStyle = .blackTranslucent
Sie können eine bool-Eigenschaft mit dem Namen "shouldStatusBarDark" verwenden, um die Farbe der Statusleiste umzuschalten. Sie können auch den Wert 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
})
}
}
Die meisten dieser Antworten sind die gleichen, die noch einmal abgefragt wurden, aber keiner von ihnen richtet sich tatsächlich an den Startbildschirm, wenn ich einen dunklen Hintergrund verwende.
Ich bin mit dem folgenden in meinem info.plist
umgegangen, der eine leichte Statusleiste erzeugt hat.
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Wenn Sie eine modale Präsentation verwenden, müssen Sie Folgendes festlegen:
viewController.modalPresentationCapturesStatusBarAppearance = true
So fügen Sie der großen Ansage von @Krunal https://stackoverflow.com/a/49552326/4697535 hinzu
Falls Sie eine UINavigationController
verwenden, hat die preferredStatusBarStyle
keine Auswirkung auf die UIViewController
.
Xcode 10 und Swift 4.
Festlegen einer benutzerdefinierten 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
}
}
}
Wenn Sie die Statusleiste in der gesamten App ändern möchten.
Info.plist Änderungen nicht vergessen
Führen Sie Ihr Projekt aus und überprüfen Sie es.
Mein Projekt in Swift 5 und Xcode 10.2
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
}
Bitte fügen Sie die folgende Zeile in Ihre info.plist ein, dann können nur Sie es erreichen
"Controller-basierte Statusleiste anzeigen = NEIN"
Fügen Sie den folgenden Code in Ihren Code ein und sehen Sie sich die Ausgabe an
UIApplication.shared.statusBarStyle = .lightContent
UIApplication.shared.statusBarStyle = .default
Für Objective C fügen Sie diese Zeile einfach in Ihre didFinishLaunch-Methode Ihrer Anwendung ein
UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Ich habe bekommen:
Das Überschreiben von var muss genauso zugänglich sein wie der umgebende Typ
Die wurde durch Hinzufügen von public
wie folgt behoben:
override public var preferredStatusBarStyle: UIStatusBarStyle {
get {
return .lightContent
}
}
Auf Swift3 iOS10.
Wenn Sie die Warnung erhalten: Der Setter für 'statusBarStyle' ist in iOS 9.0 veraltet: Verwenden Sie - [UIViewController preferredStatusBarStyle] , und setzen Sie die Statusleiste auf hell oder dunkel. Verwenden Sie dazu den folgenden Code:
//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 Navigationsleiste 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 sind.
View controller-based status bar appearance to YES
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
}
}