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.info
Flaggen- 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: 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 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 UIViewController
Instanz 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:
- Bei der Initialisierung des Bildschirms, wenn die Benutzeroberfläche vorbereitet wird.
- 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 statusBar
Objekt mit KVC und legen dessen Hintergrundfarbe fest. Objekt, das Sie auf diese Weise erhalten, ist das UIStatusBar
, das von Eigentum abgeleitet ist UIView
und 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 UINavigationBar
Ansatzes, 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")
}
}
}