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 für meinen UIViewController bereitgestellt werden?
Antworten:
[AKTUALISIERT] Für Xcode 10+ & Swift 4.2+
Dies ist die bevorzugte Methode für iOS 7 und höher
In Ihrer Anwendung
Info.plist
setztView controller-based status bar appearance
aufYES
.Überschreiben Sie
preferredStatusBarStyle
( Apple Docs ) in jedem Ihrer View Controller. Beispielsweise:Wenn Sie
preferredStatusBarStyle
einen anderen bevorzugten Statusleistenstil zurückgegeben haben, der auf Änderungen in Ihrem Ansichts-Controller basiert (z. B. ob die Bildlaufposition oder ein angezeigtes Bild dunkel ist), möchten Sie anrufen,setNeedsStatusBarAppearanceUpdate()
wenn sich dieser Status ändert.iOS vor Version 7, veraltete Methode
Apple hat dies abgelehnt , daher wird es in Zukunft entfernt. Verwenden Sie die oben beschriebene Methode, damit Sie sie bei der Veröffentlichung der nächsten iOS-Version nicht neu schreiben müssen.
Wenn Ihre Anwendung In Ihren Anwendungen unterstützt
Info.plist
, setzen SieView controller-based status bar appearance
aufNO
.Fügen Sie
appDelegate.swift
in derdidFinishLaunchingWithOptions
Funktion Folgendes hinzu:Für den Navigationscontroller
Wenn Sie einen Navigations - Controller verwenden , und Sie wollen der bevorzugte Statusleiste Stil jeden View - Controller verwendet und eingestellt wird ,
View controller-based status bar appearance
umYES
in Ihrer Anwendunginfo.plist
quelle
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 oderlightContent
Weißer Text auf schwarzem Hintergrund.So richten Sie eine dieser Einstellungen ein ( eine Einstellung für alle Bildschirme ):
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 :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:
setNeedsStatusBarAppearanceUpdate()
des Codes.Im letzteren Fall können Sie das Erscheinungsbild der Statusleiste mit dem folgenden Code ändern:
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:
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 dasUIStatusBar
, das von Eigentum abgeleitet istUIView
und somit natürlich unterstütztbackgroundColor
. 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 desUINavigationBar
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.
quelle
Sie könnten versuchen, den zurückgegebenen Wert zu überschreiben, anstatt ihn festzulegen. Die Methode ist als {get} deklariert. Geben Sie einfach einen Getter an:
Wenn Sie dies bedingt festlegen, müssen Sie anrufen,
setNeedsStatusBarAppearanceUpdate()
damit die Änderung animiert wird, wenn Sie bereit sindquelle
prefersStatusBarHidden
für einige Ihrer Ansichten auswählen können . Wenn SieUIApplication.shared.statusBarStyle
mitgehen, bleiben Sie dabei.Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Für mich funktioniert diese Methode nicht:
als ich an jeden View Controller gewöhnt war, aber das funktionierte:
Fügen Sie in der Datei info.list row: hinzu
View controller-based status bar appearance
und setzen Sie aufNO
Weiter in appdelegate:
quelle
Wenn Sie die
statusBar
Farbe des Weiß für alle in a enthaltenen Ansichten in Weiß ändern möchtenUINavigationController
, fügen Sie Folgendes hinzuAppDelegate
:Dieser Code:
funktioniert nicht für
UIViewControllers
in a enthaltenUINavigationController
, weil der Compiler nach demstatusBarStyle
von suchtUINavigationController
, nicht nach demstatusBarStyle
von ihmViewControllers
enthaltenen.Hoffe das hilft denen, die mit der akzeptierten Antwort nicht erfolgreich waren!
quelle
Wenn Sie den Statusleistenstil jederzeit nach dem Anzeigen der Ansicht ändern möchten, können Sie Folgendes verwenden:
In der Datei info.list Zeile hinzufügen: Zeigen Sie das Erscheinungsbild der Controller-basierten Statusleiste an und setzen Sie sie auf JA
quelle
If you call this method within an animation block, the changes are animated along with the rest of the animation block.
Sie müssen den folgenden Schlüssel in Ihre Info.plist-Datei einfügen:
View controller-based status bar appearance
mit booleschem Wert auf gesetztNO
In Ihrer Appdelegate-Klasse in
didFinishLaunchingWithOptions
Methode vor der Rückgabe.ändern
backgroundColor
undstatusBarStyle
nach Anforderung.quelle
Xcode 10 oder höher
Getestet in Swift 5
Es ist kein Code erforderlich. Befolgen Sie einfach die folgenden Schritte.
Vergessen Sie nicht die Änderungen an info.plist
Führen Sie Ihr Projekt aus und überprüfen Sie es.
Mein Projekt in Swift 5 und Xcode 10.2 & 11.0
quelle
Sie können dies auch im Storyboard tun
Sie müssen dies für jeden Navigationscontroller tun, den Sie haben. Alle Ansichten unter diesem Navigationscontroller ändern jedoch den Stil / die Farbe aller Statusleisten der Ansicht in die gerade ausgewählte. Ich finde diese Option besser, da Sie Ihre Ergebnisse sofort sehen können und nicht in jedem View Controller zusätzliche Codezeilen hinzufügen müssen.
(Fertig mit Xcode 8.3.3 in einem All Swift-Projekt)
quelle
View controller-based status bar appearance = NO
nur den hellen oder dunklen Stil in der gesamten App festzulegen und verwenden zu müssen. Es ist eine Schande, dass diese "codelose" Methode nur in Navigation Controller funktioniert. Apple sollte in Betracht ziehen, ein weiteres Feld hinzuzufügen, um diese Option in einer View Controller-Instanz festzulegen.Für Benutzer, die die Statusleiste für alle Viewcontroller unter iOS 11 ändern möchten, ist die Swfit 4/5-Lösung ziemlich einfach.
1) Info.plist hinzufügen:
2) Linke Seite des XCode-Slect-Projekts> Ziele > Wählen Sie Ihr Projekt aus> Unter Allgemein> Bereitstellungsinformationen> Statusleistenstil auswählen : Hell
Wenn Sie die Statusleiste nur für einen Viewcontroller ändern möchten , fügen Sie in viewDidLoad Folgendes hinzu:
2.1 ) Info.plist
2.2 )
Objective-C (oder native Reaktion) ändert sich von App Delegate:
1) Info.plist hinzufügen:
2) AppDelegate -> didFinishLaunchingWithOptions
Das Ändern der Statusleiste funktioniert nicht beim Versuch, Push (Navigationscontroller) auszuführen, sondern nur beim Präsentieren von modalen Ansichtscontrollern.
quelle
Im ersten Schritt müssen Sie eine Zeile mit Schlüssel:
View controller-based status bar appearance
und WertNO
zurInfo.plist
Datei hinzufügen . Fügen Sie danach 2 Funktionen in Ihrem Controller hinzu, die nur von diesem Controller ausgeführt werden:quelle
Swift 3
Fügen Sie in Info.plist eine Zeile mit dem Namen "Controller-basiertes Erscheinungsbild der Statusleiste anzeigen" hinzu und setzen Sie den Wert auf
No
.quelle
Beim Umgang mit Navigationsleisten scheint es ein kleines Problem mit der Textfarbe der Statusleiste zu geben.
Wenn Sie möchten, dass der .plist-Eintrag "Controller-basiertes Statusleisten-Erscheinungsbild anzeigen" aktiviert ist, funktioniert
YES
dies manchmal nicht, wenn Sie eine farbige Navigationsleiste haben.Beispielsweise:
und
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}
Der obige Code funktioniert auch dann nicht, wenn Sie im AppDelegate Folgendes festgelegt haben:
UIApplication.shared.statusBarStyle = .lightContent
Für diejenigen, die immer noch Probleme haben, wird anscheinend anhand der Stile in der Navigationsleiste beurteilt, ob die Statusleiste hell oder dunkel sein muss. Daher konnte ich dies beheben, indem ich in viewWillAppear die folgende Zeile hinzufügte:
nav?.barStyle = UIBarStyle.black
Wenn der Balkenstil schwarz ist, hört er auf Ihre überschriebene Variable. Hoffe das hilft jemandem :)
quelle
Xcode 8.3.1, Swift 3.1
Erstellen Sie einen neuen Eintrag in info.plist "Controller-basiertes Erscheinungsbild der Statusleiste anzeigen" und setzen Sie ihn auf "NEIN".
Öffnen Sie AppDelegate.swift und fügen Sie diese Zeilen in die Methode "didFinishLaunchingWithOptions" ein:
application.statusBarStyle = .lightContent
quelle
Hier finden Sie Apple-Richtlinien / Anweisungen zur Änderung des Statusleistenstils.
Wenn Sie Statusleiste Stil festlegen möchten, Anwendungsebene dann eingestellt ,
UIViewControllerBasedStatusBarAppearance
umNO
in der.plist
Datei. Und in Ihremappdelegate
>didFinishLaunchingWithOptions
add follow ine (programmgesteuert können Sie dies vom App-Delegaten aus tun).Ziel c
Schnell
Wenn Sie den Statusleistenstil auf Ansicht des Controllers festlegen möchten, gehen Sie folgendermaßen vor:
UIViewControllerBasedStatusBarAppearance
inYES
in der.plist
Datei, wenn Sie den Statusleistenstil nur auf UIViewController-Ebene festlegen müssen.In der viewDidLoad Add-Funktion -
setNeedsStatusBarAppearanceUpdate
Überschreiben Sie den bevorzugten StatusBarStyle in Ihrem Ansichts-Controller.
Ziel c
Schnell
Stellen Sie den Wert von .plist entsprechend der Setup-Ebene des Statusleistenstils ein.
quelle
Hinzufügen zur großen Antwort von @Krunal https://stackoverflow.com/a/49552326/4697535
Wenn Sie a verwenden
UINavigationController
,preferredStatusBarStyle
hat dies keine Auswirkungen auf dieUIViewController
.Xcode 10 und Swift 4.
Legen Sie eine benutzerdefinierte fest
UINavigationController
Beispiel:
Verwenden Sie eine Erweiterung für eine Lösung auf App-Ebene:
quelle
Swift 4.0 Bitte verwenden Sie diesen Code in der Appdelegate-Klasse "didFinishLaunchingWithOptions launchOptions:"
quelle
Swift 4+
für weißen Statusleisten-Text:
quelle
iOS 11.2
quelle
Das hat bei mir funktioniert
Setzen Sie das
View controller-based status bar
Erscheinungsbild in plist auf NO und fügen Sie dannUIViewController
viewDidAppear
gerade die folgende Zeile hinzuquelle
schnell 3
Wenn in der Info.plist das Aussehen der Controller-basierten Statusleiste angezeigt wird = JA
Verwenden Sie diese Erweiterung dann für alle NavigationController
Wenn es keinen UINavigationController gibt und nur UIViewController hat, verwenden Sie den folgenden Code:
quelle
Swift 5
Um mehr Details für die Antwort von PRAVEEN unter https://stackoverflow.com/a/40066798/2082851 hinzuzufügen , möchte ich meine Implementierung bereitstellen. Es unterstützt die Flexibilität , die Statusleiste jedes Controllers anzupassen.
Insgesamt werden wir eine erstellen,
BaseViewController
die diestatusBarStyle
Eigenschaft in jedem Fall behandelt. Wenn Sie einen neuen Controller erstellen, machen Sie ihn als Unterklasse dieses Basis-Controllers.Wenn Sie das Erscheinungsbild des Status ändern möchten, müssen Sie nur diese Eigenschaft aktualisieren. Der Statusleistenstil wird sofort aktualisiert.
Implementierung
Demo
2.
UINavigationController
Denn
UINavigationController
es ist ein Sonderfall, dem Sie beide Lösungen folgen können:Lösung A: Mit Nachrichtenversand überschreiben
Da UINavigationController ein ist
NSObject
und von diesem erbtObjectiveC
, sind seine Methodenmessage dispatch
und Sie können sie überschreiben.Lösung B:
UINavigationController
Unterklasse erstellenWenn Sie bereits eine benutzerdefinierte
UINavigationController
Lösung haben (die normalerweise mehr Anforderungen steuern muss), ist dies die beste Lösung für Sie.quelle
Sie können eine bool-Eigenschaft mit dem Namen "shouldStatusBarDark" verwenden, um die Farbe der Statusleiste umzuschalten. Sie können den Wert auch aktualisieren, um die Farbe der Statusleiste beim Scrollen zu ändern.
quelle
Die meisten dieser Antworten sind die gleichen, die erneut gehasht wurden, aber keine von ihnen adressiert tatsächlich den Startbildschirm für mich, wenn ich einen dunklen Hintergrund verwende.
Ich habe dies mit dem folgenden Problem umgangen
info.plist
, das eine leicht gestaltete Statusleiste hervorbrachte.quelle
Wenn Sie die Warnung erhalten: Setter für 'statusBarStyle' war in iOS 9.0 veraltet: Verwenden Sie - [UIViewController PreferredStatusBarStyle]. Verwenden Sie den folgenden Code, um die Statusleiste auf hell oder dunkel zu setzen:
Dadurch ändert sich Ihre navBar 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 haben.
quelle
Wenn Sie eine modale Präsentation verwenden, müssen Sie Folgendes festlegen:
quelle
In iOS 13 können Sie die
.darkContent
UIStatusBarStyle
Eigenschaft verwenden, um die dunkle Statusleiste anzuzeigenquelle
Fügen Sie für Ziel C einfach diese Zeile in die didFinishLaunch-Methode Ihrer Anwendung ein
quelle
mit WebkitView
Swift 9.3 iOS 11.3
quelle
Wenn Sie den Statusleistenstil basierend auf der Methode immer noch nicht ändern können
Sie können versuchen, diese Methode zu verwenden:
quelle