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 lub lightContent
biał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 UIViewController
potrzebnej 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:
- Podczas inicjalizacji ekranu, gdy przygotowywany jest interfejs użytkownika.
- 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 statusBar
obiekt za pomocą KVC i ustawiasz jego kolor tła. Przedmiotem, który otrzymujesz w ten sposób UIStatusBar
, jest pochodna, UIView
a zatem naturalnie wspiera backgroundColor
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ędnienia UINavigationBar
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.
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")
}
}
}