Dernière mise à jour (Xcode 10+ / Swift 4.2+)
Cet article est laissé intact pour quiconque souhaite comprendre la logique derrière les différentes approches qui étaient présentes depuis plusieurs années. Pendant ce temps, à partir de Xcode 10, la première approche de Swift 4.2 est obsolète et n'est plus prise en charge (c'est -à- dire qu'elle ne prendra pas effet si vous essayez de l'utiliser). Il est toujours référé pour votre information afin de mieux comprendre le raisonnement derrière le Plist.info
drapeau et la pratique de personnalisation.
Précision importante
Il est très important de comprendre deux approches pour personnaliser l'apparence de la barre d'état. Ils sont différents et ne doivent pas être mélangés.
Première approche - une couleur pour l'ensemble de l'application (obsolète depuis iOS7)
Dans info.plist, vous trouvez ou créez une clé appelée
View controller-based status bar appearance
et réglez-le sur NON .
Ce qu'il fait? Il établit essentiellement un paramètre qui indique que dans votre application, l'apparence de la barre d'état n'est pas définie individuellement par chaque contrôleur de vue . C'est très important à comprendre. Cela signifie que vous avez un réglage uniforme pour toute l'application, pour tous les écrans. Il existe deux paramètres:, default
qui est du texte noir sur fond blanc, ou lightContent
, qui est du texte blanc sur fond noir.
Pour définir l'un de ces paramètres ( un paramètre pour tous les écrans ):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
De cette façon, vous n'aurez pas besoin de rétablir ce paramètre sur chaque contrôleur de vue. Cependant, vous pouvez toujours recourir à cette méthode pour changer volontairement d'apparence.
Deuxième approche - couleur individuelle pour chaque contrôleur de vue
C'est le contraire. Pour que cela fonctionne, accédez à info.plist et définissez
View controller-based status bar appearance
à OUI
De cette façon, chaque fois qu'un nouveau contrôleur de vue est ouvert, le style de la barre d'état est défini individuellement si vous insérez cette implémentation dans chaque UIViewController
instance dont vous avez besoin:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
Vous avez le même que dans le premier, définissez le style sombre ou clair pour la barre d'état, individuel à chaque contrôleur de vue.
Cette propriété est récupérée par UIKit dans deux scénarios:
- Lors de l'initialisation de l'écran, lorsque l'interface utilisateur est en cours de préparation.
- En appelant
setNeedsStatusBarAppearanceUpdate()
le code.
Dans ce dernier cas, vous êtes autorisé à manipuler l'apparence de la barre d'état avec le code suivant:
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
Ensuite, chaque fois que vous appelez toggleAppearance()
, le changement de style de la barre d'état sera déclenché.
Troisième approche - Hack!
Il y a un hack qui permet d'accéder directement à la barre d'état:
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
}
Pourquoi pirater? Si vous avez besoin d'une couleur de barre d'état autre que le noir ou le blanc, vous utilisez une API non documentée. Vous obtenez un statusBar
objet en utilisant KVC et définissez sa couleur d'arrière-plan. L'objet que vous obtenez de cette façon est UIStatusBar
, qui est dérivé de UIView
et prend donc naturellement en charge la backgroundColor
propriété. C'est un moyen sale, pas légal, mais jusqu'à présent, c'est le seul moyen de configurer une couleur personnalisée pour la barre d'état (sans prendre en compte l' UINavigationBar
approche, qui permet de personnaliser complètement l'apparence de la barre de navigation + de la barre d'état). Cela pourrait bien conduire votre application à être rejetée. Mais peut-être que vous avez de la chance. Et si vous l'êtes, dans certaines circonstances complexes (comme la hiérarchie des contrôleurs imbriqués, de navigation enfant et de vue), cela peut être à peu près le seul, ou du moins le moyen le moins gênant de personnaliser l'apparence de la barre d'état (par exemple, pour la rendre transparente)
Xcode 10+, Swift 4.2
Il n'y a plus d'alternatives: le développeur devrait laisser chaque contrôleur de vue définir l'apparence de la barre d'état, en définissant l'indicateur sur OUI (ou en omettant cette action, car c'est OUI par défaut) et en suivant les instructions ci-dessus.
Prime
Solution basée sur le piratage que vous pouvez (bien que non encouragé à) utiliser dans des circonstances complexes afin de modifier volontairement l'apparence de la barre d'état à tout moment. En ce qui concerne les couleurs, la méthode d'extension suivante fait exactement ce que vous auriez pu faire avec une approche régulière. Vous pouvez l'adapter à vos besoins.
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")
}
}
}