W mojej aplikacji iPhone zbudowany z Xcode 5 dla iOS 7 ustawić UIViewControllerBasedStatusBarAppearance=YES
w info.plist
, aw moim ViewController
mam ten kod:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Ale pasek stanu jest nadal czarny na czarnym tle.
Wiem, że można to zmienić app-wide poprzez ustawienie UIViewControllerBasedStatusBarAppearance=NO
w info.plist
, ale faktycznie trzeba zmienić to na viewController
za viewController
podstawę przy starcie.
iphone
ios7
xcode5
uistatusbar
Andrew Smith
źródło
źródło
Odpowiedzi:
Odkryłem, że jeśli Twój ViewController znajduje się wewnątrz navigationController, to navigationController
navigationBar.barStyle
określa statusBarStyle.Ustawianie navigationBar na
barStyle
celuUIBarStyleBlackTranslucent
dadzą biały pasek statusu tekstu (np.UIStatusBarStyleLightContent
), AUIBarStyleDefault
da czarny tekst paska stanu (tzn.UIStatusBarStyleDefault
).Zauważ, że dotyczy to nawet jeśli całkowicie zmienisz kolor NavigationBar za pomocą jego
barTintColor
.źródło
UINavigationController
„spreferredStatusBarStyle
nie zadzwonić do ViewController przez to gospodarze, a zamiast tego po prostu zwraca na podstawie jego navigationBarStyle.UIBarStyleBlackTranslucent
jest przestarzałe, użyjUIBarStyleBlack
zamiast tegoOK, oto sztuczka. Musisz dodać klawisz „Wyświetl pasek stanu oparty na kontrolerze” i ustawić wartość na Nie.
Jest to sprzeczne z tym, co wydaje się mieć znaczenie tego klucza, ale nawet jeśli ustawisz wartość na
No
, nadal możesz zmienić wygląd paska stanu i to, czy jest on wyświetlany, czy nie w dowolnym kontrolerze widoku. Więc działa jak „Tak”, ale ustaw go na „Nie”!Teraz mogę uzyskać biały lub ciemny pasek stanu.
źródło
Do
preferredStatusBarStyle()
pracy wewnątrzUINavigationController
iUITabBarController
dodaję następujący kod, który pobierze preferowany styl paska stanu z aktualnie widocznego kontrolera widoku.Dla Swift 3 nie są to metody, ale właściwości:
Nazwy właściwości Swift 4.2 zostały zmienione:
Stosowanie
źródło
Być może przyjdę do tego trochę późno, ale na wypadek, gdyby ktoś inny szukał działającego i zweryfikowanego rozwiązania dla całej aplikacji.
@mxcl ma rację, opisując, dlaczego tak się dzieje. Aby to poprawić, po prostu tworzymy rozszerzenie (lub kategorię w obj-c), które przesłania metodę preferowanąSatusBarStyle () metody UINavigationController. Oto przykład w Swift:
Ten kod po prostu wyodrębnia pierwszy kontroler widoku (główny kontroler widoku) i rozpakowuje go (w obj-c po prostu sprawdź, czy nie jest nil). Jeśli rozpakowanie powiedzie się (nie zerowe), pobieramy rootViewControllers preferowanyStatusBarStyle. W przeciwnym razie po prostu zwracamy wartość domyślną.
Mam nadzieję, że pomoże to każdemu, kto może tego potrzebować.
źródło
return self.preferredStatusBarStyle()
odwołałby się do tej samej metody.visibleViewController
byłby jeszcze lepszyAby podać więcej szczegółów w zaakceptowanej odpowiedzi, umieść następujący wiersz w
didFinishLaunchingWithOptions:
metodzie delegata aplikacji :Następnie w swoim Info.plist dodaj
View controller-based status bar appearance
i ustaw naNO
.Uważam, że tak należy to zrobić, NIE z poziomu kontrolera nawigacji, jeśli chcesz mieć ten sam kolor paska stanu dla całej aplikacji. Możesz mieć ekrany, które niekoniecznie są osadzone w
UINavigationController
innejUINavigationController
podklasie lub gdzie indziej, i inne rzeczy.EDYCJA : Możesz to również zrobić bez wpisywania kodu: https://stackoverflow.com/a/18732865/855680
źródło
W viewDidLoad po prostu napisz to
po prostu zrób to i zadziała
czy możesz tego spróbować
Jeszcze jedna rzecz, którą zauważyłem w twoim pytaniu, że napisałeś taką metodę
ale tak powinno być
źródło
[self setNeedsStatusBarAppearanceUpdate];
taka świetna metoda, dziękuję!Oto jak to rozwiązałem. Zazwyczaj navigationController lub tabBarController są tymi, które decydują o wyglądzie paska stanu (ukryty, kolor itp.).
Skończyło się na tym, że podklasowałem kontroler nawigacji i zastąpiłem preferowanyStatusBarStyle. jeśli bieżący widoczny ViewContorller implementuje StatusBarStyleHandler, proszę o wartość, która ma być używana jako styl, jeśli nie, po prostu zwracam wartość domyślną.
Sposób wyzwalania aktualizacji wyglądu paska stanu polega na wywołaniu,
setNeedsStatusBarAppearanceUpdate
które wyzwalapreferredStatusBarStyle
ponownie i aktualizuje interfejs użytkownika zgodnie z tym, co zwraca metodaNastępnie użycie
źródło
1) Jedno ustawienie dla całego projektu:
Jeśli to możliwe, usuń
UIViewControllerBasedStatusBarAppearance
parę klucz-wartość z info.plist lub ustaw jąNO
bez usuwania. Jeśli nie jest dostępny w Twojej info.plist, nie rób nic. Wartość domyślna jestNO
dla tej właściwości.Dodaj poniższy kod do swojego AppDelegate.m:
2) Różne ustawienia dla różnych kontrolerów widoku:
Dodaj
UIViewControllerBasedStatusBarAppearance
parę klucz-wartość do swojej listy info.plist i ustaw ją naYES
.Jeśli kontroler widoku nie jest osadzony w kontrolerze nawigacji. Powiedzmy, że MyViewController. po prostu dodaj poniższy kod do pliku MyViewController.m. Jeśli kontroler widoku jest osadzony w kontrolerze nawigacji, utwórz nową klasę Cocoa Touch i ustaw ją podklasę UINavigationController. Powiedzmy, że MyNC. Wybierz widok kontrolera nawigacji w swoim Storyboard, w prawym okienku; Narzędzia -> Inspektor tożsamości -> Klasa niestandardowa -> Klasa, wpisz „MyNC”. Po połączeniu widoku Storyboard z klasą Cocoa Touch „MyNC” dodaj poniższy kod do swojego MyNC.m:
źródło
Mimo wszystkich odpowiedzi tutaj nadal nie znalazłem dla mnie dokładnego rozwiązania, ale zacząłem od odpowiedzi od Daniela. Skończyło się na:
w kontrolerach nawigacji (podobnie dla zakładki, tylko selectedViewController). A następnie uszanuje:
W każdym kontrolerze widoku, chyba że ustawisz inaczej. Nie muszę
setNeedsStatusBarAppearanceUpdate()
nigdzie dzwonić , po prostu aktualizuje się, gdy dotrzesz do każdego kontrolera widoku.źródło
Rozwiązanie (a) iOS 13
W odpowiedzi, która uzyskała najwyższą liczbę głosów, użyto „starszego” kodu 👎
Ustawienie tej
barStyle
właściwości jest teraz (iOS 13+) uważane za „starsze dostosowanie”. Według Apple ,Odnośnie twojej próby - byłeś na dobrej drodze!
UINavigationController
jest podklasąUIViewController
(kto wiedział 🙃)!Dlatego prezentując kontrolery widoku osadzone w kontrolerach nawigacji, tak naprawdę nie prezentujesz osadzonych kontrolerów widoku; prezentujesz kontrolery nawigacji!
UINavigationController
, jako podklasaUIViewController
, dziedziczypreferredStatusBarStyle
ichildForStatusBarStyle
, które można ustawić według potrzeb.Każda z następujących metod powinna działać:
Zastąp
preferredStatusBarStyle
w ramachUINavigationController
preferredStatusBarStyle
( doc ) - preferowany styl paska stanu dla kontrolera widokuPodklasa lub rozszerzenie
UINavigationController
LUB
Zastąp
childForStatusBarStyle
w ramachUINavigationController
childForStatusBarStyle
( doc ) - wywoływane, gdy system potrzebuje kontrolera widoku do określenia stylu paska stanuPodklasa lub rozszerzenie
UINavigationController
LUB
Możesz zwrócić dowolny kontroler widoku, który chcesz powyżej. Polecam jedno z poniższych:
topViewController
(zUINavigationController
) ( doc ) - kontroler widoku u góry stosu nawigacjivisibleViewController
(zUINavigationController
) ( doc ) - kontroler widoku powiązany z aktualnie widocznym widokiem w interfejsie nawigacji (wskazówka: może to obejmować „kontroler widoku przedstawiony modalnie na górze samego kontrolera nawigacji”)Uwaga: Jeśli zdecydujesz się na podklasę
UINavigationController
, pamiętaj, aby zastosować tę klasę do swoich kontrolerów nawigacji za pośrednictwem inspektora tożsamości w IB.PS Mój kod używa składni Swift 5.1 😎
źródło
.default
styl uwzględnia tryb ciemny i nie jest to udokumentowane, więc jeśli obsługujesz również poprzednie wersje iOS, możesz dodać,if #available(iOS 13, *) { return .darkContent } else { return .default }
jeśli próbujesz ręcznie ustawić styl paska stanu zgodnie z kolor za paskiem stanu i ten kolor jest „jasny”.Jeśli chcesz ukryć pasek statusu podczas splashScreen, ale chciałeś zmienić styl na jasną zawartość (StatusBarInitialHidden na Plist musi mieć wartość NO, aby ukryć pasek statusu na powitaniu), możesz dodać to do metody didFinishLaunchingWithOptions aplikacji appDelegate, aby zmienić na lightContent.
źródło
szybki przykład
w AppDelegate.swift
w zestawie info.plist Wyświetl wygląd paska stanu kontrolera: NIE
źródło
Jeśli używasz
NavigationController
, możesz podklasę,NavigationController
aby skonsultowała się ze swoim podrzędnym kontrolerem widoku// MyCustomNavigationController
źródło
Swift 4.2
źródło
Możesz ustawić styl paska stanu. Będzie przypominał pasek stanu, taki jak IOS 6 i poniżej.
Wklej te metody w kontrolerze widoku
i wywołanie tej metody z widoku ładowało się w ten sposób
źródło
[self setStatusBarNeedsUpdate]
w drugim bloku? (Lub przynajmniej coś innego).Chcę tylko dodać notatkę dotyczącą konkretnego przypadku, z którym miałem do czynienia. Miałem inne okno UIWindow w mojej aplikacji, które wyświetlało czat, który cały czas unosił się po mojej aplikacji. To spowodowało, że żadne z powyższych rozwiązań nie zadziałało i nie jestem pewien, dlaczego! Jedyne, co zauważyłem, to to, że mój ViewController w nowym UIWindow był tego przyczyną! A gdybym chciał zmienić styl paska stanu, muszę to zrobić w tym kontrolerze widoku nowego UIWindow.
Ta uwaga może pomóc innym, którzy mają podobną strukturę! Więc w zasadzie możesz zastosować rozwiązania wymienione powyżej w ViewController nowego UIWindow.
Znowu to konkretny przypadek.
Dzięki
źródło
Dla Swift 3 w Twoim UIViewController:
źródło