Dernière mise à jour (Xcode 10+ / Swift 4.2+)
Cet article est laissé intact pour toute personne désireuse de comprendre la logique derrière les différentes approches qui étaient présentes ces dernières années. En attendant, à partir de Xcode 10, Swift 4.2 première approche est déprécié et n'est plus pris en charge (c.-à-d. ne sera pas prendre effet si vous essayez de l'employer). Il est toujours référencé pour votre information afin de mieux comprendre le raisonnement derrière Plist.info
le drapeau et la pratique de la personnalisation.
Précision importante
Il est très important de comprendre deux approches de la personnalisation de l'apparence de la barre d'état. Elles sont différentes et ne doivent pas être mélangées.
Première approche - une couleur pour toute l'application (DÉPRÉCIÉ depuis iOS7)
Dans info.plist vous trouvez ou créez une clé appelée
View controller-based status bar appearance
et le régler sur NON .
Ce qu'il fait ? Il établit essentiellement un paramètre qui dit que dans votre application, l'apparence de la barre d'état n'est pas défini individuellement par chaque contrôleur de vue . Il est très important de le comprendre. Cela signifie que vous disposez d'un paramètre uniforme pour l'ensemble de l'application. tous écrans. Il existe deux paramètres : default
qui est un texte noir sur fond blanc, ou bien lightContent
qui est un texte blanc sur fond noir.
Pour configurer l'un de ces éléments ( un seul réglage 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 le faire fonctionner, allez dans info.plist et mettez
View controller-based status bar appearance
à OUI
Ainsi, à 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
l'instance dont vous avez besoin :
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
Vous avez la même chose que dans le premier cas, définir un 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.
- Lors de l'appel
setNeedsStatusBarAppearanceUpdate()
dans le code.
Dans ce dernier cas, vous pouvez manipuler l'apparence de la barre d'état en utilisant 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 existe 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 noire ou blanche, vous utilisez une API non documentée. Vous obtenez statusBar
en utilisant KVC et en définissant sa couleur de fond. L'objet que vous obtenez de cette façon est UIStatusBar
qui est dérivé de UIView
et soutient donc naturellement backgroundColor
propriété. C'est une méthode sale et non légale, mais jusqu'à présent, c'est la seule façon de définir une couleur personnalisée pour la barre d'état (sans tenir compte de l'option UINavigationBar
qui permet de personnaliser entièrement l'apparence de la barre de navigation et de la barre d'état). Cela pourrait bien conduire votre application à être rejetée. Mais vous avez peut-être de la chance. Et si c'est le cas, dans certaines circonstances complexes (comme une hiérarchie de contrôleurs de navigation et de vue enfants imbriqués), cela peut être la seule façon, ou du moins la moins gênante, 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 doit laisser chaque le contrôleur d'affichage définit l'apparence de la barre d'état, en mettant l'indicateur à OUI (ou omettre cette action, car elle est OUI par défaut) et suivre les instructions ci-dessus.
Bonus
Une solution de type "hack" que vous pouvez (sans y être 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 l'approche normale. 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")
}
}
}
0 votes
Essayez ceci var preferredStatusBarStyle : UIStatusBarStyle = .lightContent