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?

Author: Krunal, 2016-08-03

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
   }
}
 498
Author: PRAVEEN,
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:

  1. po zainicjowaniu ekranu, gdy interfejs jest przygotowywany.
  2. 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")
        }
    }
}
 168
Author: Hexfire,
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

 132
Author: Abizern,
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 na NO

  • Następny w appdelegate:

    UIApplication.shared.statusBarStyle = .lightContent
    
 107
Author: Gracu,
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.

  1. Wybierz projekt z nawigatora projektu (lewy panel boczny).
  2. wybierz cel.
  3. wybierz zakładkę Ogólne.
  4. Znajdź informacje o wdrożeniu.
  5. Zmień styl paska stanu na Light (dla ciemnego tła "Light", Light background "Default")

Nie zapomnij info.zmiany plist

  1. wybierz zakładkę Info
  2. 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

 38
Author: Vivek,
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ą!

 36
Author: Mr. Xcoder,
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 
        } 
    }
    
 27
Author: alex de oliveira,
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.

 25
Author: Himanshu padia,
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

  1. Utwórz nowy wpis w info.plist "View controller-based status bar appearance" ustaw go na "YES".
  2. 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)
  3. Przejdź do prawego panelu i kliknij sekcję atrybuty
  4. 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.

Tutaj wpisz opis obrazka

(zrobione z Xcode 8.3.3 w all Swift projekt)

 15
Author: Bryan Norden,
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.

 14
Author: Doci,
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    
}
 9
Author: javimuu,
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 na YES, 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:)

 8
Author: nCr78,
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()

    }

}
 7
Author: youareawaitress,
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
      }
  }
}
 7
Author: Tal Zion,
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

  1. Utwórz nowy wpis w info.plist "View controller-based status bar appearance" ustaw go na "NO".

  2. Otwórz AppDelegate.swift i dodaj te linie w metodzie "didFinishLaunchingWithOptions":

Zastosowanie.statusBarStyle = .lightContent

 6
Author: joemalski,
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
 6
Author: Ahmadreza,
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:

  1. Ustaw UIViewControllerBasedStatusBarAppearance na YES w pliku .plist, Jeśli chcesz ustawić styl paska stanu tylko na poziomie UIViewController.
  2. W funkcji dodawania viewDidLoad- setNeedsStatusBarAppearanceUpdate

  3. 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.

Tutaj wpisz opis obrazka

 6
Author: Krunal,
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
}
 5
Author: Karthick C,
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
            }
        }
    }
}

Tutaj wpisz opis obrazka

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
    }
}
 5
Author: nahung89,
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
}
 4
Author: Satish Babariya,
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)
 3
Author: Anshad Rasheed,
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
         }
     }
 3
Author: Datt Patel,
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
 3
Author: RomanMisnikov,
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
         })
     }
 }
 2
Author: tiantong,
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>
 2
Author: CodeBender,
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
 2
Author: Richard Hope,
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

 2
Author: Hubert Fabisiak,
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
}
 2
Author: Jin,
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
  1. Wybierz Zawartość ŚwiatłaTutaj wpisz opis obrazka

  2. Dodaj wygląd paska stanu opartego na kontrolerze z NO do .plist Tutaj wpisz opis obrazka

 2
Author: J A S K I E R,
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;
 0
Author: Asfand Shabbir,
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