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?

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
}

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

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


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!)


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
} 

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

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

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


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

1

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

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.