UIStatusBarStyle nie działa w Swift

85

Próbuję zmienić kolor paska stanu w mojej aplikacji Swift na biały, ale uderzam w ścianę z cegły. Mam 3 ViewControllers, z których każdy jest osadzony w NavigationController (czy to może być problem? Próbowałem już umieścić kod w klasie NavigationController). Wypróbowałem oba poniższe fragmenty kodu w didFinishLaunchingWithOptions mojego AppDelegate .swift, ale żaden nie działał.

application.statusBarStyle = .LightContent

i

UIApplication.sharedApplication().statusBarStyle = .LightContent

Wszystko, co Docs mają do powiedzenia na ten temat, to to, że UIBarButtonStyle jest Intem i dał mi ten fragment wyliczenia, który wcale nie pomógł mi w implementacji.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

czego mi brakuje?

davidrayowens
źródło

Odpowiedzi:

145

Masz dwie możliwości.

Jeśli chcesz kontynuować ręczne ustawianie stylu paska stanu, kontynuuj to, co robisz, ale musisz dodać następujący klucz do swojego pliku info.plist o wartości NO.

Wyświetl wygląd paska stanu opartego na kontrolerze

Lub, jeśli chcesz nadal używać wyglądu paska stanu opartego na kontrolerze widoku, zamiast ustawiać statusBarStyle aplikacji, zastąp preferredStatusBarStylewłaściwość w każdym kontrolerze widoku, dla którego chcesz określić styl paska stanu.

Szybki 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Szybki 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Mick MacCallum
źródło
Wypróbowałem ten kod ... ale widzę tylko biały pasek stanu na pierwszym ekranie .. Nie otrzymuję paska stanu dla pozostałych ekranów :( .. jakaś pomoc?
Rahul
7
Musisz ustawić opcję „Wyświetl wygląd paska stanu na podstawie kontrolera” w pliku plist na TAK.
StackUnderflow
1
Dzieje się tak tylko wtedy, gdy chcesz użyć wyglądu paska stanu opartego na kontrolerze widoku.
Sam Holmes
4
w iOS 10 (Swift 3.0) nie jest to już metoda, ale właściwość. Zobacz: stackoverflow.com/questions/38862208/…
stevo.mit
tylko na jeden ekran
Oubaida AlQuraan
143

Swift 3.0

w AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

w AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO
Maselko
źródło
1
To idealna odpowiedź :)
Jay Mayu,
1
Doskonała odpowiedź. Krótkie i słodkie.
Mehul
3
przepraszam, to może być najprostsza odpowiedź, ale zdecydowanie nie jest NAJLEPSZA: ponieważ ustawia ten jeden styl dla wszystkich kontrolerów widoku w aplikacji. Zachowanie zostało wprowadzone, aby umożliwić dokładniejszą kontrolę i zastosować różne ustawienia w oparciu o różne kontrolery widoku (np. Mieszanie jasnej i ciemnej zawartości).
auco
To dziwne - nie to, co mówią doktorzy Apple, ale działa. Wypróbowałem kilka innych sposobów, w tym pasek stanu oparty na UIViewController, żaden z nich nie działał.
n13
33

Musisz ustawić:

navigationController.navigationBar.barStyle = .black

a tekst pojawi się na biało

Nico S.
źródło
1
Dzięki! Nie było nic nie pomogło nawet to nadpisanie func preferredStatusBarStyle () -> UIStatusBarStyle {return UIStatusBarStyle.LightContent} to naprawdę pomaga: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana
Podziękować! Uratowałeś mój dzień. Jednak BlackTranslucent jest przestarzały. W związku z tym użyłem navigationController.navigationBar.barStyle = .Black
hsusmita
Doskonale współpracuje z override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Musisz tylko dobrze napisać tę linię viewDidLoaddla wrok. Upewnij się, że korzystasz View controller-based status bar appearance = YESz tego rozwiązania.
Bhavin_m
wygląda na przesadę ... po prostu wypróbowałem to i działało tak w pliku Info.plist: 1. Styl paska stanu -> UIStatusBarStyleLightContent 2. Wyświetl wygląd paska stanu kontrolera -> NIE
raistlin
21

W przypadku iOS9.x i Xcode7 po prostu umieść to w środku AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

Spowoduje to automatyczną zmianę stylu paska stanu .Lightcontentna wszystkie kontrolery widoku w kontrolerze UINavigationController.

(Ponadto usuń View controller-based status bar appearancez Info.plist, aby pominąć ostrzeżenia, które prawdopodobnie również widzisz!)

Biodave
źródło
Dziękuję Ci. Wygląda na to, że w iOS9 jest poważny błąd. To był jedyny sposób, w jaki mogłem zmienić pasek stanu na początkowy biały VC. Próbowałem wszystkiego. Złożę radar.
1b0t
PreferowanyStatusBarStyle zwraca UIStatusBarStyleDefault, ale nie aktualizuje lightcontent do darkcontent dla określonego kontrolera widoku. Po self.navigationController.navigationBar.barStyle = UIBarStyleDefault; in view WillAppear pracował dla mnie. Mam nadzieję, że ten komentarz pomoże innym.
Pandey_Laxman
Zauważ, że UIStatusBarStyle został zmieniony na „.black” (mała litera B) w Swift 3
brycejl
16

W Swift 3 styl paska stanu zmienił się na obliczoną właściwość w UIViewController, którą można zastąpić w następujący sposób:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 
Eric Welander
źródło
13

W systemie iOS 9 następujące (setStatusBarStyle) są przestarzałe i otrzymasz ostrzeżenie, jeśli zrobisz to w ten sposób.

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

Jeśli chcesz, aby wszystkie paski statusu zostały zmienione za jednym razem, spróbuj dodać następujące elementy do swojej Info.plist. Spowoduje to również ustawienie białego paska stanu na ekranie uruchamiania. Chociaż powyższy kod nie.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
GuiSoySauce
źródło
Podejście .plist jest poprawne, ale metoda setStatusBarStyle () nie jest konieczna. „setStatusBarStyle (_: animated :)” został wycofany w iOS 9.0: użycie - [UIViewController preferowanyStatusBarStyle]
Bill Chan
@BillChan dzięki za komentarz, ale proszę przeczytać zysk odpowiedzi. Już wyjaśniłem, że „setStatusBarStyle” jest przestarzały. Należy użyć preferowanegoStatusBarStyle, jeśli chcesz zmienić jeden lub inny viewControllers. Podejście plist jest przeznaczone dla tego, kto chce, aby wszystkie kontrolery viewControllers zostały zmienione w jednym ujęciu. Tutaj nie ma dobra ani zła. To tylko kwestia tego, co musisz osiągnąć.
GuiSoySauce
1
UIStatusBarStyle = UIStatusBarStyleLightContent (w .plist) pomogło w uruchomieniu mojej aplikacji z białym tekstem paska stanu ... Dzięki!
Chris Allinson
10

dla mnie wszystko powyżej nie zadziała, dopóki nie dodam:

self.navigationController?.navigationBar.barStyle = .black;

więc:

  1. Ustaw UIViewControllerBasedStatusBarAppearancena YESin.plist
  2. W trakcie viewDidLoadrozmowyself.setNeedsStatusBarAppearanceUpdate();
  3. Zastąp preferowanyStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. W metodzie nadpisanej ustawiam również navigationBar.barStyleostateczną wartość
    dla zawartości jasnej :
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    a dla zawartości czarnej użyj wartości domyślnej

Źródło stąd i tutaj .

a jeśli to nie zadziała, możesz spróbować dodać UINavigationController extension:

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }

        return .default
    }
}
Constantin Saulenco
źródło
1
Brak komentarza do stylu paska nawigacyjnego ... ale w Swift 3, Xcode 8 - to było jedyne rozwiązanie, które działało dla mnie.
Despotovic
Jedyną wadą, jaką zauważyłem, jest to, że przy tych wszystkich krokach się zmienia, ale bez animacji
Łukasz 'Severiaan' Grela
6

Dziwne, używając Swift 3.1 i XC8.2.1, ale wszystkie powyższe nie działały.

To, co zrobiłem, jest sprawiedliwe

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return .lightContent
        }
    }
}

Bez Plist, żadnych innych rzeczy. HTH

Lord iPhonius
źródło
Działa również dla Swift 4.2.
zeeshan
2

W Swift 3.0 można przesłonić metodę pobierającą w ViewController dla wyglądu paska stanu opartego na kontrolerze View:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}
Denis Kreshikhin
źródło
1

Nie edytuj swojego Info.plist. Dodaj to do swojego ViewController.swift:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Sev
źródło
1

Krok 1. Dodaj do info.plist View controller-based status bar appearance -> NO

Krok 2. Dodaj kod w metodzie, w której chcesz zmienić kolor paska stanu:

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

Kluczowa linia kodu: setNeedsStatusBarAppearanceUpdate()

Igor
źródło