Jak ustawić styl paska stanu w Swift 3

186

Używam Xcode 8.0 beta 4.

W poprzedniej wersji UIViewController miał metodę ustawiania stylu paska stanu

public func preferredStatusBarStyle() -> UIStatusBarStyle

W Swift 3 zauważyłem jednak, że zmieniło się na „TYLKO zmienne”.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Jak mogę podać styl do użycia w moim UIViewController?

Willjay
źródło
spróbuj tego var preferStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Odpowiedzi:

484

[AKTUALIZACJA] Dla Xcode 10+ i Swift 4.2+

Jest to preferowana metoda dla iOS 7 i wyższych

W swojej aplikacji Info.plistustaw View controller-based status bar appearancena YES.

Zastąp preferredStatusBarStyle ( dokumenty Apple ) w każdym z kontrolerów widoku. Na przykład:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Jeśli preferredStatusBarStylezwracasz inny preferowany styl paska stanu w oparciu o coś, co zmienia się wewnątrz kontrolera widoku (na przykład, czy pozycja przewijania lub czy wyświetlany obraz jest ciemny), będziesz chciał zadzwonić, setNeedsStatusBarAppearanceUpdate()gdy ten stan się zmieni.

iOS przed wersją 7, przestarzała metoda

Apple przestało to oznaczać, więc zostanie usunięte w przyszłości. Użyj powyższej metody, aby nie musieć jej przepisywać po wydaniu kolejnej wersji systemu iOS.

Jeśli aplikacja będzie obsługiwać W aplikacji Info.plist, ustaw View controller-based status bar appearancena NO.

W appDelegate.swift, z didFinishLaunchingWithOptionsfunkcją dodać:

UIApplication.shared.statusBarStyle = .lightContent

Dla kontrolera nawigacji

Jeśli używasz kontrolera nawigacji i chcesz preferowany stan bar styl każdego kontrolera widoku być używany i ustawić View controller-based status bar appearancesię YESw danej aplikacjiinfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}
PRAVEEN
źródło
3
Pracuje dla mnie. Najpierw zapomniałem wstawić nowe ustawienie do Info.plist.
falsecrypt
1
@ LightMan status uiapplicationBarStyle nie jest przestarzały, użyłem tego w iOS 11 i działa.
Sushobhit
1
@Sushobhit setStatusBarStyle został przestarzały w iOS 9, jak zastosowano w tej odpowiedzi. Ale nadal masz UIApplication.statusBarStyle jako właściwość tylko do odczytu.
LightMan
1
Są chwile, w których chcesz mieć możliwość programowego ustawienia ze względu na kolor każdego widoku.
Alejandro Cavazos
9
Możesz także usunąć wiersz w appDelegate.swift i przejść do Cel -> Ogólne -> Informacje o wdrożeniu -> Styl
paska
162

Najnowsza aktualizacja (Xcode 10+ / Swift 4.2+)

Artykuł pozostaje nietknięty dla każdego, kto chce zrozumieć logikę różnych podejść, które były obecne przez kilka ostatnich lat. Tymczasem od Xcode 10 pierwsze podejście do Swift 4.2 jest przestarzałe i nie jest już obsługiwane (tzn. Nie zadziała , jeśli spróbujesz go zastosować). Informacje te nadal są przekazywane w celu lepszego zrozumienia uzasadnienia Plist.infoflagi i praktyki dostosowywania.

Ważne wyjaśnienie

Bardzo ważne jest zrozumienie dwóch podejść do dostosowywania wyglądu paska stanu. Są różne i nie należy ich mieszać.

Pierwsze podejście - jeden kolor dla całej aplikacji (DEPRECATED od iOS7)

W info.plist znajdziesz lub utworzysz klucz o nazwie

View controller-based status bar appearance

i ustaw na NIE .

Co to robi? Zasadniczo ustanawia ustawienie, które mówi, że w twojej aplikacji wygląd paska stanu nie jest definiowany indywidualnie przez każdy kontroler widoku . Jest to bardzo ważne, aby zrozumieć. Oznacza to, że masz jednolite ustawienie dla całej aplikacji, dla wszystkich ekranów. Istnieją dwa ustawienia: defaultczarny tekst na białym tle lub lightContentbiały tekst na czarnym tle.

Aby ustawić jedno z tych ustawień ( 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 ustawiać tego ustawienia na każdym kontrolerze widoku. Jednak zawsze możesz skorzystać z tej metody, aby dobrowolnie zmienić wygląd.

Drugie podejście - indywidualny kolor dla każdego kontrolera widoku

To jest odwrotnie. Aby to działało, przejdź do info.plist i ustaw

View controller-based status bar appearance

na TAK

W ten sposób, ilekroć nowy kontroler widoku jest otwarty, styl paska stanu jest ustawiany indywidualnie, jeśli wstawisz tę implementację w każdej UIViewControllerpotrzebnej instancji:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent // .default
}

Masz taki sam jak w pierwszym, ustaw styl ciemny lub jasny dla paska stanu, indywidualnie dla każdego kontrolera widoku.

Ta właściwość jest pobierana przez UIKit w dwóch scenariuszach:

  1. Podczas inicjalizacji ekranu, gdy przygotowywany jest interfejs użytkownika.
  2. Po wywołaniu setNeedsStatusBarAppearanceUpdate()kodu.

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()
}

Następnie za każdym razem, gdy zadzwonisz toggleAppearance(), nastąpi zmiana stylu paska stanu.

Trzecie podejście - hack!

Istnieje 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 hackować? Jeśli potrzebujesz innego koloru paska stanu niż czarny lub biały, użyj nieudokumentowanego interfejsu API. Otrzymujesz statusBarobiekt za pomocą KVC i ustawiasz jego kolor tła. Przedmiotem, który otrzymujesz w ten sposób UIStatusBar, jest pochodna, UIViewa zatem naturalnie wspiera backgroundColorwłasność. Jest to brudny, niezgodny z prawem sposób, ale jak dotąd jest to jedyny sposób na ustawienie niestandardowego koloru paska stanu (bez uwzględnienia UINavigationBarpodejścia, które pozwala całkowicie dostosować wygląd paska nawigacyjnego + paska stanu). Może to doprowadzić do odrzucenia Twojej aplikacji. Ale może masz szczęście. Jeśli tak, w pewnych skomplikowanych okolicznościach (takich jak hierarchia zagnieżdżonych, podrzędnych elementów nawigacyjnych i kontrolerów widoku) może to być właściwie jedyny lub przynajmniej mniej kłopotliwy sposób dostosowania wyglądu paska stanu (na przykład, aby był przezroczysty)

Xcode 10+, Swift 4.2

Nie ma już żadnych alternatyw: programista powinien pozwolić każdemu kontrolerowi widoku zdefiniować wygląd paska stanu, ustawiając flagę na TAK (lub pomijając tę ​​akcję, ponieważ domyślnie TAK) i postępując zgodnie z powyższymi instrukcjami.


Premia

Rozwiązanie oparte na hakowaniu, którego możesz (choć nie zachęca) do użycia w skomplikowanych okolicznościach w celu dobrowolnej zmiany wyglądu paska stanu na dowolnym etapie. Pod względem kolorów następująca metoda rozszerzenia robi dokładnie to, co można było zrobić przy zwykłym 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")
        }
    }
}
Hexfire
źródło
2
Gdy masz już pasek stanu, możesz również zrobić to: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); lub użyj dowolnego istniejącego klucza, aby ustawić dowolną właściwość, która jest dostępna dla UIStatusBar, ale nie dla UIView
Mark
application.statusBarStyle = .lightContent To podejście jest zwykle od iOS9> Setter dla 'statusBarStyle' została zaniechana w iOS 9.0: użytkowania - [UIViewController preferredStatusBarStyle] czekać do odchodzenia na UIViewController
toxicsun
To jedyna funkcja, która działa tutaj podczas zmiany motywu kolorystycznego aplikacji. Wydaje się jednak, że po ustawieniu tego ustawienia zawsze trzeba go zresetować podczas przełączania kontrolerów widoku. Metoda preferStatusBarStyle () jest odtąd ignorowana (nawet przy odpowiednim ustawieniu w info.plist).
nietypowy
2
Ta odpowiedź jest bardziej opisowa w porównaniu do innych.
ViruMax,
2
Rozwiązanie premiowe jest zepsute w iOS 13.1
ViruMax
130

Możesz spróbować zastąpić 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 zadzwonić, setNeedsStatusBarAppearanceUpdate()aby animować zmianę, gdy będziesz gotowy

Abizern
źródło
2
Jest to lepsze podejście, ponieważ możesz wybrać prefersStatusBarHiddenniektóre ze swoich poglądów. Jeśli idziesz z UIApplication.shared.statusBarStyletym, utkniesz z tym.
superarts.org
105

Swift 3 i 4, iOS 10 i 11, Xcode 9 i 10
Dla mnie ta metoda nie działa:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

kiedy korzystałem z każdego kontrolera widoku, ale to działało:

  • W pliku info.list dodaj wiersz: View controller-based status bar appearancei ustaw naNO

  • Następnie w appdelegate:

    UIApplication.shared.statusBarStyle = .lightContent
Gracu
źródło
Próbowałem dopiero po dodaniu kodu do delegowania aplikacji, ale ustawienie listy informacji było dla mnie pomocne. Dziękuję
Akhilesh Sharma
6
Setter dla „statusBarStyle” został uznany za przestarzały w iOS 9.0: Użyj - [UIViewController preferStStusBarStyle]
Reimond Hill
33

Jeśli chcesz zmienić statusBarkolor na biały, dla wszystkich widoków zawartych w a 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 UIViewControllerszawartych w UINavigationController, ponieważ wygląd kompilator statusBarStylez UINavigationControllernie dla statusBarStylez ViewControllerszawartych przez niego.

Mam nadzieję, że pomoże to tym, którym nie udało się przyjąć przyjętej odpowiedzi!

Pan Xcoder
źródło
Tak dziękuje bardzo! Kontroler nawigacyjny stanowił drobny niuans, którego wielu nie brało pod uwagę!
Alexis Candelaria,
26

Jeśli chcesz zmienić styl paska stanu w dowolnym momencie po wyświetleniu widoku, możesz użyć tego:

  • W pliku info.list dodaj wiersz: Wyświetl wygląd paska stanu na kontrolerze i ustaw na TAK

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }
Alex de Oliveira
źródło
1
IIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G.
25

Musisz dodać poniższy klucz w pliku Info.plist:

View controller-based status bar appearance z wartością logiczną ustawioną na NO

W klasie appdelegate, w didFinishLaunchingWithOptionsmetodzie przed powrotem.

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

zmienić backgroundColori statusBarStylezgodnie z wymaganiami.

Himanshu padia
źródło
Dobre rozwiązanie, ale czy to się liczy jako używanie prywatnego API?
GoldenJoe
Działa dobrze, ale jak mogę zmienić kolor niestandardowy?
iSrinivasan27,
@MohanSrinivasan zamiast „UIColor.red” możesz określić własny kolor.
Himanshu padia
25

Xcode 10 lub nowszy

Testowany w Swift 5

Kod nie jest wymagany, wystarczy wykonać 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 kartę Ogólne.
  4. Znajdź informacje o wdrożeniu.
  5. Zmień styl paska stanu na Jasne (dla ciemnego tła „Jasne” , Jasne tło „Domyślne” )

Nie zapomnij o zmianach info.plist

  1. Wybierz kartę Informacje
  2. Dodaj ten klucz do pliku listy „Wyświetl wygląd paska stanu kontrolera” = NIE

Uruchom swój projekt i sprawdź go.

Mój projekt w swift 5 oraz Xcode 10.2 i 11.0

Vivek
źródło
W przypadku Xcode 10 / Swift5 powinna to być zaakceptowana odpowiedź. Aby to zadziałało, musisz wykonać OBA oba kroki.
John Robi,
Idealny. Dziękuję Ci! Zgadzam się, że powinna to być faktycznie zaakceptowana odpowiedź.
DungeonDev,
To idealna odpowiedź 🤟🏻
nikhilgohil11
To całkowicie działa również dla xcode 11 z swift 5, dzięki
Luis Santiago
13

Możesz to również zrobić w serii ujęć

  1. Utwórz nowy wpis w info.plist „Wyświetl wygląd paska stanu kontrolera” ustaw go na „TAK”.
  2. Przejdź do scenorysu, a następnie wybierz kontroler nawigacji, który chcesz zmienić. Kliknij pasek nawigacyjny w sekcji konspektu dokumentu Storyboard (lewy panel w serii ujęć)
  3. Przejdź do prawego panelu i kliknij sekcję atrybuty
  4. W sekcji Pasek nawigacji zobaczysz styl. Wybierz styl, który chcesz (domyślnie jest czarny, a czarny jest biały)

Musisz to zrobić dla każdego posiadanego kontrolera nawigacyjnego. Jednak wszelkie widoki w tym kontrolerze nawigacyjnym zmienią styl / kolor wszystkich pasków stanu widoku na właśnie wybrany. Znajduję tę opcję lepiej, ponieważ możesz natychmiast zobaczyć swoje wyniki i nie musisz dodawać dodatkowych wierszy kodu w każdym kontrolerze widoku.

wprowadź opis zdjęcia tutaj

(Gotowe z Xcode 8.3.3 w projekcie Swift)

Bryan Norden
źródło
„Wyświetl wygląd paska stanu kontrolera” powinien mieć wartość „NIE”
Willjay,
2
Bardzo czysty sposób na ustawienie stylu paska stanu zgodnie z zawartością kontrolera widoku, co jest poprawnym sposobem zamiast tylko ustawiania View controller-based status bar appearance = NOi konieczności używania tylko jasnego lub ciemnego stylu w całej aplikacji. Szkoda, że ​​ten „bezkodowy” sposób działa tylko w Nawigatorze. Apple powinien rozważyć dodanie innego pola do ustawienia tej opcji w dowolnej instancji View Controller.
aldoram5,
12

Dla osób, które chcą zmienić pasek stanu dla wszystkich kontrolerów widoku na: iOS 11, rozwiązanie Swfit 4/5 jest dość łatwe.

1) Info.plist dodaj:

Wyświetl wygląd paska stanu kontrolera -> NIE

2) Lewa strona XCode slect projektu> Cele > Wybierz projekt> W obszarze Ogólne> Informacje o wdrożeniu> Wybierz styl paska stanu: Światło

Jeśli chcesz zmienić pasek stanu tylko dla jednego kontrolera widoku , w viewDidLoad dodaj:

2.1 ) Info.plist

Zobacz wygląd paska stanu kontrolera -> TAK

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Zmiana celu C (lub zareagowanie natywne) z poziomu Delegata aplikacji:

1) Info.plist dodaj:

Wyświetl wygląd paska stanu kontrolera -> NIE

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

Zmiana paska stanu nie działa przy próbie wykonania wypychania (kontrolerów nawigacyjnych), tylko przy prezentowaniu modalnie kontrolerów widoku.

Doci
źródło
8

Pierwszym krokiem jest dodanie wiersza z kluczem: View controller-based status bar appearancei wartością NOdo Info.plistpliku. Następnie dodaj 2 funkcje w kontrolerze tylko do określonych, które kontroler wykona:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        UIApplication.shared.statusBarStyle = .default    
}
javimuu
źródło
6

Szybki 3

W Info.plist dodaj wiersz o nazwie „Wyświetl pasek stanu oparty na kontrolerze” i ustaw jego wartość na No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarStyle = .lightContent //or .default
        setNeedsStatusBarAppearanceUpdate()

    }

}
jesteś oczekującą
źródło
6

Wydaje się, że jest mały problem z kolorem tekstu paska stanu podczas obsługi pasków nawigacyjnych.

Jeśli chcesz, aby pozycja .plist Wyświetl wygląd paska stanu opartego na kontrolerze był ustawiony na YES, czasami nie będzie działać, jeśli masz kolorowy pasek nawigacji.

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 w AppDelegate ustawiłeś następujące ustawienia:

UIApplication.shared.statusBarStyle = .lightContent

Dla tych, którzy wciąż borykają się z problemami, najwyraźniej w jakiś sposób ocenia, czy style na pasku nawigacji muszą być jasne czy ciemne. Udało mi się to naprawić, dodając następujący wiersz w viewWillAppear:

nav?.barStyle = UIBarStyle.black

Gdy styl słupka jest czarny, wówczas nasłuchuje na przesłoniętej zmiennej. Mam nadzieję, że to komuś pomoże :)

nCr78
źródło
6

Aby dodać do świetnego asnwer przez @Krunal https://stackoverflow.com/a/49552326/4697535

W przypadku korzystania z UINavigationController, nie preferredStatusBarStylebędzie to miało wpływu na UIViewController.

Xcode 10 i Swift 4.

Ustaw niestandardowy UINavigationController

Przykład:

class LightNavigationController: UINavigationController {

   open override var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
   }
}

Użyj rozszerzenia dla rozwiązania 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
      }
  }
}
Tal Zion
źródło
5

Xcode 8.3.1, Swift 3.1

  1. Utwórz nowy wpis w info.plist „Wyświetl wygląd paska stanu kontrolera” ustaw go na „NIE”.

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

application.statusBarStyle = .lightContent

joemalski
źródło
5

Oto Wskazówki / instrukcje Apple dotyczące zmiany stylu paska stanu.

Jeśli chcesz ustawić styl paska stanu, poziom aplikacji, a następnie ustaw UIViewControllerBasedStatusBarAppearancena NOw swoim .plistpliku. I w swoim appdelegate> didFinishLaunchingWithOptionsdodaj następujący ine (programowo możesz to zrobić z aplikacji delegowanej).

Cel C

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

Szybki

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 kroki:

  1. Ustaw UIViewControllerBasedStatusBarAppearancesię YESw .plistpliku, jeśli trzeba ustawić status bar w stylu tylko na poziomie UIViewController.
  2. W funkcji dodawania viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. przesłonić preferowanyStatusBarStyle w kontrolerze widoku.

Cel C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Szybki

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Ustaw wartość .plist zgodnie z poziomem konfiguracji stylu paska stanu.

wprowadź opis zdjęcia tutaj

Krunal
źródło
4

Swift 4.0 Użyj tego kodu w „didFinishLaunchingWithOptions launchOptions:” Klasa Appdelegate

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
}
Karthickkck
źródło
4

Swift 4+

dla białego tekstu paska stanu:

navigationController.navigationBar.barStyle = .blackTranslucent
Alfi
źródło
4

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
}
Satish Babariya
źródło
„blackOpaque” jest niedostępny: Użyj UIStatusBarStyleLightContent
Makalele
3

To zadziałało dla mnie

Ustaw View controller-based status barwygląd na NIE w liście, a następnie W UIViewController viewDidAppearwłaśnie dodano następujący wiersz

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Anshad Rasheed
źródło
setStatusBarStyle jest nieaktualny w iOS 9.
Lastmboy
3

szybki 3

jeśli Wyświetl wygląd paska stanu na kontrolerze = TAK w 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 opcji Poniższy kod:

    extension UIViewController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }
Datt Patel
źródło
2
Nie działa dla mnie. Pojawiają się błędy „Właściwość nie zastępuje żadnej właściwości z jej nadklasy” i „Getter dla 'preferStatusBarStyle' z selektorem Objective-C„ preferStatusBarStyle ”powoduje konflikt z poprzednią deklaracją z tym samym selektorem Objective-C”.
Theo
Dzięki za to, po 20 różnych próbach i kilku kombinacjach przedmiotów do wypróbowania, jest to sposób na ustawienie koloru paska stanu. Musiałem tylko pamiętać o wywołaniu setNeedsStatusBarAppearanceUpdate (), kiedy chciałem zmienić kolor, ponieważ dodawałem w trybie nocnym, a czerń na czerni po prostu nie działała.
Stuart P.
3

Szybki 5

Aby dodać więcej szczegółów do odpowiedzi PRAVEEN na https://stackoverflow.com/a/40066798/2082851 , chciałbym przedstawić moją implementację. Obsługuje elastyczność dostosowywania paska stanu każdego kontrolera.

Ogólnie rzecz biorąc, stworzymy właściwość, BaseViewControllerktóra obsłuży tę statusBarStylewłaściwość we wszystkich przypadkach. Gdy tworzysz nowy kontroler, ustaw go jako podklasę tego kontrolera podstawowego.

Ilekroć chcesz zmienić wygląd statusu, musisz 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
    }
}

Próbny

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
            }
        }
    }
}

wprowadź opis zdjęcia tutaj

2) UINavigationController

Na UINavigationController, jest to szczególny przypadek, który można śledzić zarówno rozwiązania:

Rozwiązanie A: Zastąp z wysyłaniem wiadomości

Ponieważ UINavigationController jest NSObjecti dziedziczy po ObjectiveC, jego metody są message dispatchi można je zastąpić.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Rozwiązanie B: Utwórz UINavigationControllerpodklasę

Jeśli masz już niestandardowy UINavigationController(który zwykle musi kontrolować więcej wymagań), jest to najlepsze rozwiązanie dla Ciebie.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}
nahung89
źródło
2

Możesz użyć właściwości bool o nazwie „shouldStatusBarDark”, aby przełączyć kolor paska stanu. Możesz także 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
         })
     }
 }
Tiantong
źródło
co to jest właściwość navView? dzięki za udostępnienie rozwiązania
medskill
1
@medskill NavView to tylko naśladujący pasek nawigacyjny dodany programowo.
Tiantong
2

Większość z tych odpowiedzi jest ponownie zmieniona, ale żadna z nich nie odnosi się do ekranu startowego podczas używania ciemnego tła.

Obejrzałem to z następującymi w moim, info.plistktóre wytworzyły pasek stanu w jasnej stylistyce.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
CodeBender
źródło
2

Jeśli otrzymujesz ostrzeżenie: Setter dla 'statusBarStyle' był przestarzały w iOS 9.0: Użyj - [UIViewController preferStatusBarStyle] , a 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

Nie spowoduje to zmiany paska nawigacyjnego, jedynie wskazuje styl i dlatego odpowiednio zmienia pasek stanu.

NB Musisz upewnić się, że ustawiłeś na swojej info.plist.

View controller-based status bar appearance to YES
Richard Hope
źródło
2

Jeśli używasz prezentacji modalnej, musisz ustawić:

viewController.modalPresentationCapturesStatusBarAppearance = true
Roman Misznikow
źródło
1

W iOS 13 możesz użyć .darkContent UIStatusBarStylewłaściwości do wyświetlenia ciemnego paska stanu

Hubert Fabisiak
źródło
0

Dla celu C wystarczy dodać ten wiersz do metody didFinishLaunch aplikacji

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Asfand Shabbir
źródło
3
To jest przestarzałe od iOS 9
MK_Dev
0

za pomocą WebkitView

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}
Oszałamiający Człowiek
źródło
3
Swift 9.3? Niepoprawny rok, Marty
iOS Unit
Polecam trzymać się z daleka od używania prywatnego API dla przykładu „statusBar”. Apple wprowadza zmiany w interfejsie API za każdym razem! A gdy Apple zmieni interfejs API, aplikacja może ulec awarii i nie zmieni już paska stanu. Spowoduje to ponowne wyszukanie innego rozwiązania.
Doci
0

Jeśli nadal nie możesz zmienić stylu paska stanu, zastosuj metodę

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
}
Jin
źródło