In meinem iPhone - Anwendung mit Xcode 5 für iOS 7 I gebaut Satz UIViewControllerBasedStatusBarAppearance=YES
in info.plist
, und in meinem ViewController
Ich habe diesen Code:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Die Statusleiste ist jedoch vor dem schwarzen Hintergrund immer noch schwarz.
Ich weiß , seine möglichen diese App weit um die Einstellung zu ändern UIViewControllerBasedStatusBarAppearance=NO
in info.plist
, aber ich brauche eigentlich diese auf einem verändern , viewController
indem viewController
zum Laufzeit - Basis.
iphone
ios7
xcode5
uistatusbar
Andrew Smith
quelle
quelle
Antworten:
Ich habe festgestellt, dass, wenn sich Ihr ViewController in einem Navigationscontroller befindet, der Navigationscontroller
navigationBar.barStyle
den statusBarStyle bestimmt.Wenn Sie die Navigationsleiste
barStyle
aufUIBarStyleBlackTranslucent
einstellen, wird ein weißer Statusleisten-Text (dhUIStatusBarStyleLightContent
) undUIBarStyleDefault
ein schwarzer Statusleisten-Text (dhUIStatusBarStyleDefault
) angezeigt .Beachten Sie, dass dies auch dann gilt, wenn Sie die Farbe der Navigationsleiste über ihre vollständig ändern
barTintColor
.quelle
UINavigationController
'spreferredStatusBarStyle
den von ihm gehosteten ViewController nicht aufruft und stattdessen nur basierend auf seinem Navigationsbereich zurückgibt.UIBarStyleBlackTranslucent
ist veraltet, verwenden SieUIBarStyleBlack
stattdessenOK, hier ist der Trick. Sie müssen den Schlüssel "Controller-basierte Statusleiste anzeigen" hinzufügen und den Wert auf "Nein" setzen.
Dies steht im Widerspruch zu der Bedeutung dieses Schlüssels. Selbst wenn Sie den Wert auf festlegen
No
, können Sie das Erscheinungsbild der Statusleiste und die Anzeige in einem Ansichts-Controller ändern. Es verhält sich also wie "Ja", aber setzen Sie es auf "Nein"!Jetzt kann ich die Statusleiste weiß oder dunkel bekommen.
quelle
Für
preferredStatusBarStyle()
an die Arbeit innerhalbUINavigationController
undUITabBarController
ich fügen Sie den folgenden Code, der die bevorzugte Statusleiste Stil aus dem aktuell sichtbaren View - Controller erhalten.Für Swift 3 sind dies keine Methoden, sondern Eigenschaften:
Die Swift 4.2- Eigenschaften wurden umbenannt:
Verwendung
quelle
Ich komme vielleicht etwas spät dazu, aber falls jemand anderes nach einer funktionierenden und verifizierten App-weiten Lösung sucht.
@mxcl beschreibt korrekt, warum dies geschieht. Um dies zu korrigieren, erstellen wir einfach eine Erweiterung (oder Kategorie in obj-c), die die PreferredSatusBarStyle () -Methode von UINavigationController überschreibt. Hier ist ein Beispiel in Swift:
Dieser Code extrahiert einfach den ersten View-Controller (den Root-View-Controller) und packt ihn aus (in obj-c überprüfen Sie einfach, ob er nicht Null ist). Wenn das Entpacken erfolgreich ist (nicht Null), greifen wir auf den RootViewController PreferredStatusBarStyle zu. Andernfalls geben wir nur die Standardeinstellung zurück.
Hoffe das hilft jedem, der es braucht.
quelle
return self.preferredStatusBarStyle()
würde in genau dieselbe Methode zurückrufen.visibleViewController
wäre noch besserFügen Sie die folgende Zeile in die
didFinishLaunchingWithOptions:
Methode Ihres App-Delegaten ein , um mehr Details in die akzeptierte Antwort aufzunehmen :Fügen Sie dann in Ihrer Info.plist diese hinzu
View controller-based status bar appearance
und setzen Sie sie aufNO
.Ich glaube, so sollte es gemacht werden, NICHT vom Navigationscontroller, wenn Sie die gleiche Statusleistenfarbe für die gesamte App wünschen. Möglicherweise haben Sie Bildschirme, die nicht unbedingt in eine
UINavigationController
oder eine andereUINavigationController
Unterklasse eingebettet sind , und andere Dinge.BEARBEITEN : Sie können dies auch tun, ohne Code einzugeben : https://stackoverflow.com/a/18732865/855680
quelle
In viewDidLoad schreiben Sie dies einfach
Tu das einfach und es wird funktionieren
Kannst du das bitte versuchen?
Eine weitere Sache, die ich in Ihrer Frage gesehen habe, ist, dass Sie die Methode so geschrieben haben
aber es sollte so sein
quelle
[self setNeedsStatusBarAppearanceUpdate];
so eine tolle Methode, danke!Hier ist, wie ich es gelöst habe. Normalerweise entscheiden der Navigationscontroller oder der tabBarController über das Erscheinungsbild der Statusleiste (ausgeblendet, Farbe usw.).
Also habe ich den Navigationscontroller unterklassifiziert und den bevorzugten StatusBarStyle überschrieben. Wenn der aktuell sichtbare ViewContorller StatusBarStyleHandler implementiert, fordere ich die Verwendung des Werts als Stil an. Wenn dies nicht der Fall ist, gebe ich einfach einen Standardwert zurück.
Sie lösen eine Aktualisierung des Erscheinungsbilds der Statusleiste aus, indem Sie aufrufen,
setNeedsStatusBarAppearanceUpdate
welchepreferredStatusBarStyle
erneut ausgelöst wird, und die Benutzeroberfläche entsprechend der Rückgabe der Methode aktualisierenDann Verwendung
quelle
1) Eine Einstellung für das gesamte Projekt:
Falls verfügbar, entfernen Sie das
UIViewControllerBasedStatusBarAppearance
Schlüssel-Wert-Paar aus Ihrer info.plist oder legen Sie es fest,NO
ohne es zu entfernen. Wenn es in Ihrer info.plist nicht verfügbar ist, tun Sie nichts. Standard istNO
für diese Eigenschaft.Fügen Sie Ihrem AppDelegate.m den folgenden Code hinzu:
2) Unterschiedliche Einstellungen für unterschiedliche Ansichtssteuerungen:
Fügen Sie
UIViewControllerBasedStatusBarAppearance
Ihrer info.plist ein Schlüssel-Wert-Paar hinzu und setzen Sie es aufYES
.Wenn Ihr View Controller nicht in Navigation Controller eingebettet ist. Sagen wir MyViewController. Fügen Sie einfach den folgenden Code zu Ihrer MyViewController.m-Datei hinzu. Wenn Ihr View Controller in Navigation Controller eingebettet ist, erstellen Sie eine neue Cocoa Touch-Klasse und machen Sie sie zur Unterklasse von UINavigationController. Sagen wir MyNC. Wählen Sie in Ihrem Storyboard im rechten Bereich die Option "Navigationscontroller-Ansicht" aus. Dienstprogramme -> Identitätsinspektor -> Benutzerdefinierte Klasse -> Klasse, geben Sie "MyNC" ein. Fügen Sie nach dem Verknüpfen der Storyboard-Ansicht mit Ihrer "MyNC" Cocoa Touch-Klasse den folgenden Code zu Ihrer MyNC.m hinzu:
quelle
Trotz aller Antworten hier fand ich immer noch nicht die genaue Lösung für mich, sondern begann mit der Antwort von Daniel. Am Ende hatte ich:
in Navigationscontrollern (ähnlich für Registerkarte, nur ausgewählter ViewController). Und dann wird es respektieren:
In jedem Ansichts-Controller, sofern Sie nichts anderes festlegen. Ich muss
setNeedsStatusBarAppearanceUpdate()
nirgendwo anrufen , es wird nur aktualisiert, wenn Sie an jedem View Controller ankommen.quelle
iOS 13 Lösung (en)
Die Antwort mit der höchsten Bewertung verwendet "Legacy" -Code 👎
Das Festlegen der
barStyle
Eigenschaft wird jetzt (iOS 13+) als "Legacy-Anpassung" betrachtet. Laut Apple ,In Bezug auf Ihren Versuch - Sie waren auf dem richtigen Weg!
UINavigationController
ist eine Unterklasse vonUIViewController
(wer wusste 🙃)!Wenn Sie in Navigations-Controllern eingebettete Ansichts-Controller präsentieren, präsentieren Sie die eingebetteten Ansichts-Controller daher nicht wirklich. Sie präsentieren die Navigationssteuerungen!
UINavigationController
, als Unterklasse vonUIViewController
, erbtpreferredStatusBarStyle
undchildForStatusBarStyle
, die Sie nach Wunsch einstellen können.Jede der folgenden Methoden sollte funktionieren:
preferredStatusBarStyle
Innerhalb überschreibenUINavigationController
preferredStatusBarStyle
( doc ) - Der bevorzugte Statusleistenstil für den AnsichtscontrollerUnterklasse oder erweitern
UINavigationController
ODER
childForStatusBarStyle
Innerhalb überschreibenUINavigationController
childForStatusBarStyle
( doc ) - Wird aufgerufen, wenn das System den View Controller zur Bestimmung des Statusleistenstils benötigtUnterklasse oder erweitern
UINavigationController
ODER
Sie können jeden View Controller zurückgeben, den Sie oben möchten. Ich empfehle eine der folgenden Möglichkeiten:
topViewController
(ofUINavigationController
) ( doc ) - Der Ansichts-Controller oben im NavigationsstapelvisibleViewController
(ofUINavigationController
) ( doc ) - Der Ansichtscontroller, der der aktuell sichtbaren Ansicht in der Navigationsoberfläche zugeordnet ist (Hinweis: Dies kann "einen Ansichtscontroller umfassen, der modal über dem Navigationscontroller selbst dargestellt wurde").Hinweis: Wenn Sie sich für eine Unterklasse entscheiden
UINavigationController
, denken Sie daran, diese Klasse über den Identitätsinspektor in IB auf Ihre Navigationssteuerungen anzuwenden.PS Mein Code verwendet die Swift 5.1-Syntax 😎
quelle
.default
berücksichtigt der Stil den Dunkelmodus und ist nicht dokumentiert. Wenn Sie also auch frühere iOS-Versionen unterstützen, können Sie ihn hinzufügen,if #available(iOS 13, *) { return .darkContent } else { return .default }
wenn Sie versuchen, den Statusleistenstil manuell gemäß dem zu konfigurieren Farbe hinter der Statusleiste und diese Farbe ist "hell".Wenn Sie die statusBar während splashScreen ausblenden möchten, aber den Stil in Light Content ändern möchten (StatusBarInitiallyHidden on Plist muss NO sein, um statusBar on splash auszublenden), können Sie dies der didFinishLaunchingWithOptions-Methode von appDelegate hinzufügen, um zu lightContent zu wechseln.
quelle
schnelles Beispiel
in AppDelegate.swift
in info.plist set Ansicht der Controller-basierten Statusleiste anzeigen: NEIN
quelle
Wenn Sie verwenden
NavigationController
, können Sie eine UnterklasseNavigationController
erstellen, damit der untergeordnete Ansichtscontroller konsultiert wird// MyCustomNavigationController
quelle
Swift 4.2
quelle
Sie können den Statusleistenstil festlegen. Es ähnelt der Statusleiste wie IOS 6 und darunter.
Fügen Sie diese Methoden in Ihren View Controller ein
und rufen Sie diese Methode aus der Ansicht auf, wurde so geladen
quelle
[self setStatusBarNeedsUpdate]
im zweiten Block? (Oder zumindest etwas anderes).Ich möchte nur eine Notiz für einen bestimmten Fall hinzufügen, mit dem ich konfrontiert war. Ich hatte ein anderes UIWindow in meiner App, um ein Chat-Gesicht anzuzeigen, das die ganze Zeit über in meiner App schwebt. Dadurch funktionierte keine der oben genannten Lösungen, und ich bin mir nicht sicher, warum! Mir ist nur aufgefallen, dass mein ViewController im neuen UIWindow der Grund dafür war! Und wenn ich den Statusleistenstil ändern wollte, muss ich dies in diesem Ansichts-Controller des neuen UIWindow tun.
Dieser Hinweis könnte anderen helfen, die eine ähnliche Struktur haben! Grundsätzlich können Sie die oben genannten Lösungen im ViewController des neuen UIWindow anwenden.
Auch dies ist ein spezieller Fall.
Vielen Dank
quelle
Für Swift 3 in Ihrem UIViewController:
quelle