Jak ustawić styl paska stanu w Swift 3
Używam Xcode 8.0 beta 4.
W poprzedniej wersji UIViewController posiada metodę do ustawiania stylu paska stanu
public func preferredStatusBarStyle() -> UIStatusBarStyle
Jednak okazało się, że zmienił się na "Get ONLY varaiable" w Swift 3.
public var preferredStatusBarStyle: UIStatusBarStyle { get }
Jak zapewnić styl do użycia w moim UIViewController?
30 answers
[Aktualizacja] dla Xcode 10 + & Swift 4.2 +
Jest to preferowana metoda dla iOS 7 i wyższych
W aplikacji Info.plist
Ustaw View controller-based status bar appearance
na YES
.
Override preferredStatusBarStyle
(Apple docs ) w każdym kontrolerze widoku. Na przykład:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Jeśli masz preferredStatusBarStyle
zwracający inny preferowany styl paska stanu w oparciu o coś, co zmienia się wewnątrz kontrolera widoku (na przykład, czy pozycja przewijania lub wyświetlany obraz jest ciemny), po zmianie tego stanu będziesz chciał wywołać setNeedsStatusBarAppearanceUpdate()
.
IOS przed wersją 7, przestarzała metoda
Apple wycofało ten, więc zostanie on usunięty w przyszłości. Użyj powyższej metody, aby nie trzeba było jej przepisywać po wydaniu następnej wersji systemu iOS.
Jeśli Twoja aplikacja będzie obsługiwać Info.plist
, Ustaw View controller-based status bar appearance
na NO
.
W appDelegate.swift
, didFinishLaunchingWithOptions
funkcja, dodaj:
UIApplication.shared.statusBarStyle = .lightContent
Dla Kontrolera Nawigacji
Jeśli używasz kontrolera nawigacji i chcesz, aby preferowany styl paska stanu każdego kontrolera widoku był używany i ustaw View controller-based status bar appearance
na YES
w aplikacji info.plist
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-25 05:58:28
[[18]}Najnowsza Aktualizacja (Xcode 10+ / Swift 4.2+)
Ten artykuł pozostaje nienaruszony dla każdego, kto chce zrozumieć logikę różnych podejść, które były obecne w ciągu ostatnich kilku lat. Tymczasem od Xcode 10, Swift 4.2 pierwsze podejście jest przestarzałe i nie jest już obsługiwane (tzn. nie będzie działać, jeśli spróbujesz go zastosować). Jest nadal kierowane do informacji, aby lepiej zrozumieć rozumowanie za Plist.info
flaga i dostosowywanie praktyki.
Ważne Wyjaśnienie
Bardzo ważne jest, aby zrozumieć dwa podejścia do dostosowywania wyglądu paska stanu. Są różne i nie powinny być mieszane.
Pierwsze podejście – jeden kolor dla całej aplikacji (przestarzały od iOS7)]}W info.plist można znaleźć lub utworzyć klucz o nazwie
View controller-based status bar appearance
I ustaw go na NO .
Co to robi? Zasadniczo ustanawia ustawienie, które mówi, że w Twoim aplikacja, wygląd paska stanu nie jest definiowany indywidualnie przez każdy kontroler widoku . To jest bardzo ważne, aby zrozumieć. Oznacza to, że masz jednolite ustawienie dla całej aplikacji, dla wszystkich ekranów. Istnieją dwa ustawienia: default
, czyli czarny tekst na białym tle, lub lightContent
, czyli biały tekst na czarnym tle.
Aby ustawić jedno z nich ( jedno ustawienie dla wszystkich ekranów):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
W ten sposób nie będziesz musiał ponownie instalować tego ustawienia na każdy kontroler widoku. Zawsze możesz jednak skorzystać z tej metody, aby dobrowolnie zmienić wygląd.
Drugie podejście-indywidualny kolor dla każdego kontrolera widoku
Jest odwrotnie. Aby to działało, przejdź do informacji.plist i set
View controller-based status bar appearance
Do tak
W ten sposób, gdy nowy kontroler widoku JEST OTWARTY, Styl paska stanu jest ustawiany indywidualnie, jeśli wstawisz tę implementację do każdej instancji UIViewController
, której potrzebujesz:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
Masz tak samo jak w pierwszym Ustaw ciemny lub jasny styl dla paska stanu, indywidualny dla każdego kontrolera widoku.
Ta właściwość jest pobierana przez UIKit w dwóch scenariuszach:
- po zainicjowaniu ekranu, gdy interfejs jest przygotowywany.
- po wywołaniu
setNeedsStatusBarAppearanceUpdate()
w kodzie.
W tym drugim przypadku możesz manipulować wyglądem paska stanu za pomocą następującego kodu:
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
Wtedy, gdy wywołasz toggleAppearance()
, zmiana stylu statusbar będzie / align = "left" /
Trzecie podejście-Hack!
Jest hack, który pozwala na bezpośredni dostęp do paska stanu:
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
}
Dlaczego hack? Jeśli potrzebujesz innego koloru paska stanu niż czarny lub biały, używasz nieudokumentowanego interfejsu API. Otrzymujesz statusBar
obiekt używając KVC i ustawiasz jego kolor tła. Obiekt, który otrzymujesz w ten sposób, to UIStatusBar
, który pochodzi z UIView
i w ten sposób naturalnie obsługuje właściwość backgroundColor
. Jest to brudny, nie legalny sposób, ale jak na razie jest to jedyny sposób na skonfigurowanie niestandardowego koloru dla paska stanu (nie biorąc pod uwagę podejście UINavigationBar
, które pozwala całkowicie dostosować wygląd navbar+statusbar). Może to prowadzić do odrzucenia aplikacji. Ale może masz szczęście. A jeśli tak, w pewnych złożonych okolicznościach (takich jak hierarchia zagnieżdżonych kontrolerów nawigacji i widoku) może to być prawie jedyny, a przynajmniej mniej kłopotliwy sposób dostosowania wyglądu paska stanu (na przykład, aby stał się przezroczysty) {]}
Xcode 10+, Swift 4.2
Są nie ma już alternatyw: programista powinien pozwolić każdemu kontrolerowi widoku zdefiniować wygląd paska stanu, ustawiając flagę na YES (lub pomijając tę akcję, ponieważ domyślnie jest to YES) i postępując zgodnie z powyższymi instrukcjami.
Bonus
Rozwiązanie oparte na hackowaniu, którego możesz (choć nie zachęcamy) używać w złożonych okolicznościach, aby dobrowolnie zmienić wygląd paska stanu na dowolnym etapie. Kolorystycznie, poniższa metoda rozszerzenia robi dokładnie co można było zrobić przy regularnym podejściu. Możesz dostosować go do swoich potrzeb.
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")
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
Możesz spróbować nadpisać zwracaną wartość, zamiast ją ustawiać. Metoda jest zadeklarowana jako {get }, więc po prostu podaj getter:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Jeśli ustawisz to warunkowo, musisz wywołać setNeedsStatusBarAppearanceUpdate()
, aby animować zmianę, gdy będziesz gotowy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 22:41:16
Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Dla mnie ta metoda nie działa:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Kiedy używałem każdego kontrolera widoku, ale to działało:
W pliku info.list, Dodaj wiersz:
View controller-based status bar appearance
i ustaw naNO
-
Następny w appdelegate:
UIApplication.shared.statusBarStyle = .lightContent
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-06 08:44:01
Xcode 10 lub nowszy
Testowane w Swift 5
Żaden kod nie jest wymagany po prostu wykonaj poniższe kroki.
Jeśli chcesz zmienić pasek stanu w całej aplikacji.
- Wybierz projekt z nawigatora projektu (lewy panel boczny).
- wybierz cel.
- wybierz zakładkę Ogólne.
- Znajdź informacje o wdrożeniu.
- Zmień styl paska stanu na Light (dla ciemnego tła "Light", Light background "Default")
Nie zapomnij info.zmiany plist
- wybierz zakładkę Info
- Dodaj ten klucz do pliku plist "View controller-based status bar appearance" = NO
Uruchom swój projekt i sprawdź go.
Mój projekt w swift 5 i Xcode 10.2 & 11.0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
Jeśli chcesz zmienić kolor statusBar
na biały, dla wszystkich widoków zawartych w UINavigationController
, dodaj to wewnątrz AppDelegate
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
Ten kod:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Nie działa dla UIViewControllers
zawartych w UINavigationController
, ponieważ kompilator szuka statusBarStyle
z UINavigationController
, a nie dla statusBarStyle
z ViewControllers
zawartych w nim.
Mam nadzieję, że to pomoże tym, którym nie udało się z zaakceptowaną odpowiedzią!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 14:30:19
Jeśli chcesz zmienić styl paska stanu w dowolnym momencie po pojawieniu się widoku, możesz użyć tego:
-
W pliku info.lista Dodaj wiersz: Zobacz wygląd paska stanu opartego na kontrolerze i ustaw go na YES
var viewIsDark = Bool() func makeViewDark() { viewIsDark = true setNeedsStatusBarAppearanceUpdate() } func makeViewLight() { viewIsDark = false setNeedsStatusBarAppearanceUpdate() } override var preferredStatusBarStyle: UIStatusBarStyle { if viewIsDark { return .lightContent } else { return .default } }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-29 21:41:22
Musisz dodać poniżej klucz w informacji.plik plist:
View controller-based status bar appearance
z wartością boolean ustawioną na NO
W klasie appdelegate, w metodzie didFinishLaunchingWithOptions
przed return.
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
Zmień backgroundColor
i statusBarStyle
zgodnie z wymaganiami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 13:16:32
Możesz to zrobić również w storyboardzie
- Utwórz nowy wpis w info.plist "View controller-based status bar appearance" ustaw go na "YES".
- Przejdź do storyboardu, a następnie wybierz Kontroler nawigacyjny, który chcesz zmienić. Kliknij na pasku nawigacyjnym z sekcji zarys dokumentu Storyboard (lewy panel na storyboard)
- Przejdź do prawego panelu i kliknij sekcję atrybuty
- pod paskiem nawigacyjnym zobaczysz styl. Wybierz styl you would like (domyślnie jest dla czerni, a czerń dla bieli)
Będziesz musiał to zrobić dla każdego kontrolera nawigacyjnego, który posiadasz. Jednak wszystkie widoki znajdujące się pod tym kontrolerem nawigacyjnym zmienią styl/kolor pasków stanu widoku na ten, który właśnie wybrałeś. Uważam tę opcję za lepszą, ponieważ możesz natychmiast zobaczyć swoje wyniki i nie musisz dodawać dodatkowych linii kodu w każdym kontrolerze widoku.
(zrobione z Xcode 8.3.3 w all Swift projekt)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 09:53:30
Dla osób, które chcą zmienić pasek stanu dla wszystkich kontrolerów viewcontrollerów na: iOS 11, rozwiązanie Swfit 4/5 jest dość proste.
1) Info.plist dodaj:
Wyświetl wygląd paska stanu opartego na kontrolerze- > nie
2) po lewej stronie projektu Xcode slect > cele > Wybierz swój projekt > w obszarze Ogólne > informacje o wdrożeniu > wybierz Styl paska stanu: Light
Jeśli chcesz zmienić pasek stanu tylko dla jednego kontrolera viewcontroller, przy viewDidLoad dodaj:
2.1) Info.plist
Wyświetl wygląd paska stanu opartego na kontrolerze- > TAK
2.2)
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Objective - C (lub React native) zmiana z delegata aplikacji:
1) Info.plist dodaj:
Wyświetl wygląd paska stanu opartego na kontrolerze- > nie
2) AppDelegate - > didFinishLaunchingWithOptions
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];
Zmiana paska stanu do not work trying to do push (Kontrolery nawigacyjne), tylko przy prezentowaniu modalnie viewcontrollerów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-02 13:56:06
Pierwszy krok musisz dodać wiersz z kluczem: View controller-based status bar appearance
i wartością NO
do pliku Info.plist
. Następnie dodaj 2 funkcje w kontrolerze do konkretnego tylko tego kontrolera:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = .lightContent
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = .default
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 04:14:23
Wydaje się, że w przypadku pasków nawigacyjnych występuje mały problem z kolorem tekstu paska stanu.
Jeśli chcesz .widok wejścia plist wygląd paska stanu oparty na kontrolerze ustawiony naYES
, Czasami nie działa, gdy masz kolorowy pasek nav.
Na przykład:
override func viewWillAppear(_ animated: Bool) {
let nav = self.navigationController?.navigationBar
nav?.barTintColor = .red
nav?.tintColor = .white
nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
setNeedsStatusBarAppearanceUpdate()
}
I
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}
Powyższy kod nie będzie działał, nawet jeśli ustawisz w AppDelegate:
UIApplication.shared.statusBarStyle = .lightContent
Dla tych, którzy wciąż walczą, najwyraźniej jakoś ocenia, czy pasek stanu musi być jasny lub ciemny według stylów na pasku nawigacyjnym. Tak więc udało mi się to naprawić, dodając następującą linię w viewWillAppear:
nav?.barStyle = UIBarStyle.black
Gdy Styl paska jest czarny, to nasłuchuje nadpisanej zmiennej. Mam nadzieję, że to komuś pomoże:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 06:50:22
Swift 3
W Info.plist dodaje wiersz o nazwie "View controller-based status bar appearance" i ustawia jego wartość na No
.
class YourViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarStyle = .lightContent //or .default
setNeedsStatusBarAppearanceUpdate()
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 03:53:16
Aby dodać do wielkiego asnwera przez @ Krunal https://stackoverflow.com/a/49552326/4697535
W przypadku, gdy używasz UINavigationController
, preferredStatusBarStyle
nie będzie miało wpływu na UIViewController
.
Xcode 10 i Swift 4.
Set a custom UINavigationController
Przykład:
class LightNavigationController: UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Jest to rozwiązanie na poziomie aplikacji.]}
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
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-12 14:23:09
Xcode 8.3.1, Swift 3.1
Utwórz nowy wpis w info.plist "View controller-based status bar appearance" ustaw go na "NO".
-
Otwórz AppDelegate.swift i dodaj te linie w metodzie "didFinishLaunchingWithOptions":
Zastosowanie.statusBarStyle = .lightContent
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-22 14:16:15
Swift 4+
Dla tekstu białego paska stanu:
navigationController.navigationBar.barStyle = .blackTranslucent
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 15:00:41
Oto wytyczne/Instrukcja Apple o zmianie stylu paska stanu.
Jeśli chcesz ustawić styl paska stanu, poziom aplikacji Ustaw UIViewControllerBasedStatusBarAppearance
na NO
w pliku .plist
. I w Twoim appdelegate
> didFinishLaunchingWithOptions
dodaj następujące ine (programowo możesz to zrobić z App delegate).
Objective C
[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
Swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent
return true
}
Jeśli chcesz ustawić styl paska stanu, na poziomie kontrolera widoku wykonaj następujące czynności kroki:
- Ustaw
UIViewControllerBasedStatusBarAppearance
naYES
w pliku.plist
, Jeśli chcesz ustawić styl paska stanu tylko na poziomie UIViewController. W funkcji dodawania viewDidLoad-
setNeedsStatusBarAppearanceUpdate
Zastąp preferowany styl statusbarstyle w kontrolerze widoku.
Objective 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
}
Ustaw wartość .plist zgodnie z poziomem ustawienia stylu paska stanu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-01 14:43:18
Swift 4.0 Proszę użyć tego kodu w" didFinishLaunchingWithOptions launchOptions: "AppDelegate class
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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-05 18:45:34
Swift 5
Aby dodać więcej szczegółów dla PRAVEEN ' S odpowiedź na https://stackoverflow.com/a/40066798/2082851 , chciałbym przedstawić moją realizację. Obsługuje elastyczność, aby dostosować pasek stanu każdego kontrolera.
Ogólnie rzecz biorąc, stworzymy BaseViewController
, które obsługują właściwość statusBarStyle
we wszystkich przypadkach. Gdy tworzysz nowy kontroler, utwórz go jako podklasę tego kontrolera podstawowego.
Gdy chcesz zmienić status wygląd, wystarczy tylko zaktualizować tę właściwość. Styl paska stanu zostanie natychmiast zaktualizowany.
Realizacja
class BaseViewController: UIViewController {
var statusBarStyle: UIStatusBarStyle = .default {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return statusBarStyle
}
}
Demo
class ViewController: BaseViewController, UIScrollViewDelegate {
let scrollView = UIScrollView()
...
func scrollViewDidScroll(_ scrollView: UIScrollView) {
UIView.animate(withDuration: 0.3) {
if scrollView.contentOffset.y > 30 {
self.statusBarStyle = .darkContent
} else {
self.statusBarStyle = .lightContent
}
}
}
}
2. UINavigationController
Dla UINavigationController
, jest to szczególny przypadek, który można zastosować w obu rozwiązaniach:
Rozwiązanie A: Override z wysyłaniem wiadomości
Ponieważ UINavigationController jest NSObject
i dziedziczy z ObjectiveC
, jego metody to message dispatch
i możesz nadpisać oni.
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
}
Rozwiązanie B: Utwórz UINavigationController
podklasę
Jeśli masz już własny UINavigationController
(który zwykle wymaga kontrolowania większej liczby wymagań), jest to najlepsze rozwiązanie dla Ciebie.
final class NavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-23 19:02:30
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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 12:22:49
To zadziałało dla mnie
Ustaw View controller-based status bar
wygląd na NO w plist następnie w UIViewController
viewDidAppear
po prostu dodałem następujący wiersz
UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 12:14:51
Swift 3
If View controller-based status bar appearance = YES in Info.plist
Następnie użyj tego rozszerzenia dla wszystkich NavigationController
extension UINavigationController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Jeśli nie ma UINavigationController i ma tylko UIViewController, użyj poniższego kodu:
extension UIViewController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-24 06:54:34
Jeśli używasz prezentacji modalnej, musisz ustawić:
viewController.modalPresentationCapturesStatusBarAppearance = true
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-12 11:12:13
Możesz użyć właściwości bool o nazwie "shouldStatusBarDark", aby zmienić kolor paska stanu. Możesz również zaktualizować jego wartość, aby zmienić kolor paska stanu podczas przewijania.
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
})
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 02:51:54
Większość z tych odpowiedzi jest ponownie zahaszowana, ale żadna z nich nie odnosi się do ekranu startowego, gdy używam ciemnego tła.
Obejrzałem to z poniższym w moim info.plist
, który wyprodukował pasek stanu w jasnym stylu.
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 06:57:05
Jeśli otrzymujesz Ostrzeżenie: Setter 'statusBarStyle' został wycofany w iOS 9.0: użyj - [UIViewController preferredStatusBarStyle] , Następnie aby ustawić pasek stanu na jasny lub ciemny, użyj następującego kodu:
//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
To nie spowoduje, że pasek nawigacyjny zmieni wyłącznie styl i dlatego zmieni pasek stanu odpowiednio.
NB. Musisz upewnić się, że ustawiłeś swoje informacje.plist.
View controller-based status bar appearance to YES
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-24 09:31:39
W iOS 13 możesz użyć .darkContent
UIStatusBarStyle
właściwość wyświetlania ciemnego paska stanu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-13 14:35:29
Jeśli nadal nie można zmienić bazy stylów paska stanu w metodzie
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Możesz spróbować użyć tej metody:
override viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.barStyle = .black
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-29 01:02:49
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-08 13:12:30
Dla objective C wystarczy dodać ten wiersz w swojej aplikacji didFinishLaunch method
UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-09 12:08:48