Ultimo aggiornamento (Xcode 10+ / Swift 4.2+)
Questo articolo viene lasciato intatto per chiunque sia disposto a comprendere la logica alla base dei diversi approcci presenti negli ultimi anni. Nel frattempo, a partire da Xcode 10, il primo approccio di Swift 4.2 è obsoleto e non è più supportato (ovvero non avrà effetto se si tenta di utilizzarlo). Si fa ancora riferimento alle tue informazioni per comprendere meglio il ragionamento dietro la Plist.info
bandiera e la pratica di personalizzazione.
Chiarimento importante
È molto importante comprendere due approcci alla personalizzazione dell'aspetto della barra di stato. Sono diversi e non devono essere mescolati.
Primo approccio: un colore per l'intera app (DEPRECATO da iOS7)
In info.plist trovi o crei una chiave chiamata
View controller-based status bar appearance
e impostarlo su NO .
Cosa fa? Fondamentalmente stabilisce un'impostazione che dice che nell'applicazione, l'aspetto della barra di stato non è definito individualmente da ciascun controller di visualizzazione . Questo è molto importante da capire. Ciò significa che hai un'impostazione uniforme per l'intera app, per tutte le schermate. Esistono due impostazioni:, default
che è testo nero su sfondo bianco, oppure lightContent
, che è testo bianco su sfondo nero.
Per impostare uno di questi ( un'impostazione per tutte le schermate ):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
In questo modo non sarà necessario ristabilire questa impostazione su ciascun controller di visualizzazione. Tuttavia, puoi sempre ricorrere a questo metodo per modificare volontariamente l'aspetto.
Secondo approccio: colore individuale per ciascun controller di visualizzazione
Questo è l'opposto. Per farlo funzionare, vai a info.plist e imposta
View controller-based status bar appearance
a SÌ
In questo modo, ogni volta che un nuovo controller di visualizzazione è aperto, lo stile della barra di stato viene impostato individualmente se si inserisce questa implementazione in ogni UIViewController
istanza è necessario:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
Hai lo stesso di prima, imposta lo stile scuro o chiaro per la barra di stato, individuale per ciascun controller di visualizzazione.
Questa proprietà viene recuperata da UIKit in due scenari:
- All'inizializzazione dello schermo, durante la preparazione dell'interfaccia utente.
- Dopo aver chiamato
setNeedsStatusBarAppearanceUpdate()
il codice.
In quest'ultimo caso, sei idoneo a manipolare l'aspetto della barra di stato con il seguente codice:
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
Quindi, ogni volta che chiami toggleAppearance()
, verrà attivato il cambio di stile della barra di stato.
Terzo approccio - Hack!
C'è un hack che consente di accedere direttamente alla barra di stato:
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
}
Perché hack? Se è necessario un colore della barra di stato diverso dal bianco o nero, si utilizza l'API non documentata. Ottieni statusBar
oggetto usando KVC e ne imposta il colore di sfondo. L'oggetto ottenuto in questo modo è UIStatusBar
, che deriva UIView
e quindi supporta naturalmente la backgroundColor
proprietà. Questo è un modo sporco, non legale, ma finora è l'unico modo per impostare il colore personalizzato per la barra di stato (senza tener contoUINavigationBar
dell'approccio, che consente di personalizzare del tutto l'aspetto della barra di stato +). Potrebbe indurre la tua app a essere respinta. Ma forse sei fortunato. E se lo sei, in determinate circostanze complesse (come la gerarchia dei controller di navigazione e visualizzazione nidificati), questo potrebbe essere praticamente l'unico, o almeno il modo meno problematico per personalizzare l'aspetto della barra di stato (ad esempio, per renderlo trasparente)
Xcode 10+, Swift 4.2
Non ci sono più alternative: lo sviluppatore dovrebbe consentire a ciascun controller di visualizzazione di definire l'aspetto della barra di stato, impostando il flag su SÌ (o omettendo questa azione, perché è SÌ per impostazione predefinita) e seguendo le istruzioni precedenti.
indennità
Soluzione basata su hack che potresti (anche se non incoraggiato a) utilizzare in circostanze complesse al fine di modificare volontariamente l'aspetto della barra di stato in qualsiasi fase. Dal punto di vista del colore, il seguente metodo di estensione fa esattamente ciò che avresti potuto fare con un approccio regolare. Puoi adattarlo alle tue esigenze.
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")
}
}
}