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?
Odpowiedzi:
[AKTUALIZACJA] Dla Xcode 10+ i Swift 4.2+
Jest to preferowana metoda dla iOS 7 i wyższych
W swojej aplikacji
Info.plist
ustawView controller-based status bar appearance
naYES
.Zastąp
preferredStatusBarStyle
( dokumenty Apple ) w każdym z kontrolerów widoku. Na przykład:Jeśli
preferredStatusBarStyle
zwracasz 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
, ustawView controller-based status bar appearance
naNO
.W
appDelegate.swift
, zdidFinishLaunchingWithOptions
funkcją dodać: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 appearance
sięYES
w danej aplikacjiinfo.plist
źródło
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.info
flagi 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:
default
czarny tekst na białym tle lublightContent
biały tekst na czarnym tle.Aby ustawić jedno z tych ustawień ( jedno ustawienie dla wszystkich ekranów ):
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
UIViewController
potrzebnej instancji: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:
setNeedsStatusBarAppearanceUpdate()
kodu.W tym drugim przypadku możesz manipulować wyglądem paska stanu za pomocą następującego kodu:
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:
Dlaczego hackować? Jeśli potrzebujesz innego koloru paska stanu niż czarny lub biały, użyj nieudokumentowanego interfejsu API. Otrzymujesz
statusBar
obiekt za pomocą KVC i ustawiasz jego kolor tła. Przedmiotem, który otrzymujesz w ten sposóbUIStatusBar
, jest pochodna,UIView
a zatem naturalnie wspierabackgroundColor
wł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ędnieniaUINavigationBar
podejś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.
źródło
Możesz spróbować zastąpić zwracaną wartość, zamiast ją ustawiać. Metoda jest zadeklarowana jako {get}, więc po prostu podaj getter:
Jeśli ustawisz to warunkowo, musisz zadzwonić,
setNeedsStatusBarAppearanceUpdate()
aby animować zmianę, gdy będziesz gotowyźródło
prefersStatusBarHidden
niektóre ze swoich poglądów. Jeśli idziesz zUIApplication.shared.statusBarStyle
tym, utkniesz z tym.Swift 3 i 4, iOS 10 i 11, Xcode 9 i 10
Dla mnie ta metoda nie działa:
kiedy korzystałem z każdego kontrolera widoku, ale to działało:
W pliku info.list dodaj wiersz:
View controller-based status bar appearance
i ustaw naNO
Następnie w appdelegate:
źródło
Jeśli chcesz zmienić
statusBar
kolor na biały, dla wszystkich widoków zawartych w aUINavigationController
, dodaj to wewnątrzAppDelegate
:Ten kod:
nie działa dla
UIViewControllers
zawartych wUINavigationController
, ponieważ wygląd kompilatorstatusBarStyle
zUINavigationController
nie dlastatusBarStyle
zViewControllers
zawartych przez niego.Mam nadzieję, że pomoże to tym, którym nie udało się przyjąć przyjętej odpowiedzi!
źródło
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
źródło
If you call this method within an animation block, the changes are animated along with the rest of the animation block.
Musisz dodać poniższy klucz w pliku Info.plist:
View controller-based status bar appearance
z wartością logiczną ustawioną naNO
W klasie appdelegate, w
didFinishLaunchingWithOptions
metodzie przed powrotem.zmienić
backgroundColor
istatusBarStyle
zgodnie z wymaganiami.źródło
Xcode 10 lub nowszy
Testowany w Swift 5
Kod nie jest wymagany, wystarczy wykonać poniższe kroki.
Nie zapomnij o zmianach info.plist
Uruchom swój projekt i sprawdź go.
Mój projekt w swift 5 oraz Xcode 10.2 i 11.0
źródło
Możesz to również zrobić w serii ujęć
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.
(Gotowe z Xcode 8.3.3 w projekcie Swift)
źródło
View controller-based status bar appearance = NO
i 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.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:
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
2.2 )
Zmiana celu C (lub zareagowanie natywne) z poziomu Delegata aplikacji:
1) Info.plist dodaj:
2) AppDelegate -> didFinishLaunchingWithOptions
Zmiana paska stanu nie działa przy próbie wykonania wypychania (kontrolerów nawigacyjnych), tylko przy prezentowaniu modalnie kontrolerów widoku.
źródło
Pierwszym krokiem jest dodanie wiersza z kluczem:
View controller-based status bar appearance
i wartościąNO
doInfo.plist
pliku. Następnie dodaj 2 funkcje w kontrolerze tylko do określonych, które kontroler wykona:źródło
Szybki 3
W Info.plist dodaj wiersz o nazwie „Wyświetl pasek stanu oparty na kontrolerze” i ustaw jego wartość na
No
.źródło
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:
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 :)
źródło
Aby dodać do świetnego asnwer przez @Krunal https://stackoverflow.com/a/49552326/4697535
W przypadku korzystania z
UINavigationController
, niepreferredStatusBarStyle
będzie to miało wpływu naUIViewController
.Xcode 10 i Swift 4.
Ustaw niestandardowy
UINavigationController
Przykład:
Użyj rozszerzenia dla rozwiązania na poziomie aplikacji:
źródło
Xcode 8.3.1, Swift 3.1
Utwórz nowy wpis w info.plist „Wyświetl wygląd paska stanu kontrolera” ustaw go na „NIE”.
Otwórz AppDelegate.swift i dodaj te linie w metodzie „didFinishLaunchingWithOptions”:
application.statusBarStyle = .lightContent
źródło
Oto Wskazówki / instrukcje Apple dotyczące zmiany stylu paska stanu.
Jeśli chcesz ustawić styl paska stanu, poziom aplikacji, a następnie ustaw
UIViewControllerBasedStatusBarAppearance
naNO
w swoim.plist
pliku. I w swoimappdelegate
>didFinishLaunchingWithOptions
dodaj następujący ine (programowo możesz to zrobić z aplikacji delegowanej).Cel C
Szybki
jeśli chcesz ustawić styl paska stanu, na poziomie kontrolera widoku, wykonaj następujące kroki:
UIViewControllerBasedStatusBarAppearance
sięYES
w.plist
pliku, jeśli trzeba ustawić status bar w stylu tylko na poziomie UIViewController.W funkcji dodawania viewDidLoad -
setNeedsStatusBarAppearanceUpdate
przesłonić preferowanyStatusBarStyle w kontrolerze widoku.
Cel C
Szybki
Ustaw wartość .plist zgodnie z poziomem konfiguracji stylu paska stanu.
źródło
Swift 4.0 Użyj tego kodu w „didFinishLaunchingWithOptions launchOptions:” Klasa Appdelegate
źródło
Swift 4+
dla białego tekstu paska stanu:
źródło
iOS 11.2
źródło
To zadziałało dla mnie
Ustaw
View controller-based status bar
wygląd na NIE w liście, a następnie WUIViewController
viewDidAppear
właśnie dodano następujący wierszźródło
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
jeśli nie ma UINavigationController i ma tylko UIViewController, użyj opcji Poniższy kod:
źródło
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ść,
BaseViewController
która obsłuży tęstatusBarStyle
wł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
Próbny
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
NSObject
i dziedziczy poObjectiveC
, jego metody sąmessage dispatch
i można je zastąpić.Rozwiązanie B: Utwórz
UINavigationController
podklasęJeśli masz już niestandardowy
UINavigationController
(który zwykle musi kontrolować więcej wymagań), jest to najlepsze rozwiązanie dla Ciebie.źródło
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.
źródło
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.plist
które wytworzyły pasek stanu w jasnej stylistyce.źródło
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:
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.
źródło
Jeśli używasz prezentacji modalnej, musisz ustawić:
źródło
W iOS 13 możesz użyć
.darkContent
UIStatusBarStyle
właściwości do wyświetlenia ciemnego paska stanuźródło
Dla celu C wystarczy dodać ten wiersz do metody didFinishLaunch aplikacji
źródło
za pomocą WebkitView
Swift 9.3 iOS 11.3
źródło
Jeśli nadal nie możesz zmienić stylu paska stanu, zastosuj metodę
Możesz spróbować użyć tej metody:
źródło