override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent;
}
Utiliser le code ci-dessus dans n'importe quel ViewController pour définir la couleur de statusBar sur Blanc pour un contrôleur de vue spécifiquene fonctionne pas dans iOS8 pour moi. Aucune suggestion? À l'aide de la méthode UIApplication.sharedApplication, la couleur change après les modifications requises dans Info.plist pour l'ensemble de l'application.
// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent
Comment puis-je modifier la couleur de la barre d'état pour certains ViewControllers obligatoires etspécifiques?
Après avoir lu toutes les suggestions et essayé plusieurs choses, je pourrais le faire fonctionner pour des contrôleurs de vue spécifiques en procédant comme suit:
Premier pas:
Ouvrez votre info.plist et insérez une nouvelle clé nommée "Afficher l'apparence de la barre d'état basée sur le contrôleur}" dansNO
Deuxième étape (juste une explication, pas besoin de la mettre en œuvre):
Normalement, nous mettons le code suivant dans l’application (méthode _: didFinishLaunchingWithOptions:) De la méthode AppDelegate,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
mais cela affecte la statusBarStyle
de tous les ViewControllers.
Alors, comment faire en sorte que cela fonctionne avec des ViewControllers spécifiques - Étape finale:
Ouvrez le fichier viewcontroller dans lequel vous souhaitez modifier la variable statusBarStyle
et insérez le code suivant dans viewWillAppear()
.
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
En outre, implémentez la méthode viewWillDisappear()
pour ce viewController spécifique et mettez les lignes de code suivantes,
Swift 2
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default
}
Swift 3
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}
Cette étape modifie d'abord la statusBarStyle
pour le contrôleur de vue spécifique, puis la redéfinit en default
lorsque le contrôleur de vue spécifique disparaît. Si vous n'implémentez pas la viewWillDisappear()
, la statusBarStyle
sera définitivement remplacée par la nouvelle valeur définie de UIStatusBarStyle.LightContent
(Au 14 novembre 2018)
Swift 4 , Swift 4.2
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Dans votre Info.plist, vous devez définir l’apparence de la barre d’état basée sur le contrôleur View à n’importe quelle valeur.
Si vous définissez cette option sur OUI, vous devez remplacer la fonction preferredStatusBarStyle dans chaque contrôleur de vue.
Si vous le définissez NON, vous pouvez définir le style dans AppDelegate à l'aide de
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Il y a un milliard de réponses ici alors j'ai pensé pourquoi ne pas en ajouter une autre sous la forme d'un extension (avec l'aide de @ Cœur)
extension UIApplication {
class var statusBarBackgroundColor: UIColor? {
get {
return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
} set {
(shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
}
}
}
UIApplication.statusBarBackgroundColor = .blue
override func viewWillAppear(animated: Bool) {
self.navigationController?.navigationBarHidden = true
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector("setBackgroundColor:") {
statusBar.backgroundColor = UIColor.redColor()
}
}
Swift 3
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = UIColor.black
}
C'est la solution pour définir la couleur d'arrière-plan de la barre d'état pour un contrôleur de vue spécifique.
Swift 2
J'ai pu modifier l'apparence de l'arrière-plan de la barre d'état en ajoutant les éléments suivants dans mon viewWillAppear:
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
statusBar.backgroundColor = .redColor()
}
pour Swift 3
.plist
View controller-based status bar appearance = NO
AppDelegate.Swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Custom statubar
UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = .lightContent
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = UIColor.gray
return true
}
Dans ma situation, j'utilise le storyboard pour organiser mes contrôleurs de vue. Je souhaite modifier tout le style de la barre d'état.
Vous pouvez voir dans l'image ci-dessous.
Stars
View Controller est une CPBaseNavigationController
et CPBaseNavigationController
est une sous-classe de UINavigationController
.
J'essaie de faire les prochaines étapes:
Dans AppDelegate.Swift
func didFinishLaunchingWithOptions
, ajoutez
//change status bar color
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
mais pas d'effet.
Dans StoryBoard, recherchez le Base Tab BarController
(image ci-dessus) .select Attributes Inspector
, modifiez l'attribut Sattus Bar
en Light Content
.so bad, sans effet.
La dernière fois que je l'ai obtenue. Dans mon contrôleur de navigation personnalisé CPBaseNavigationController
, ajoutez func preferredStatusBarStyle
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
Ça marche bien!
En outre, statusBarStyle
obsolète en 9.0, vous pouvez utiliser -[UIViewController preferredStatusBarStyle]
.
Implémentez preferredStatusBarStyle
comme vous l'avez mentionné et appelez self.setNeedsStatusBarAppearanceUpdate()
dans ViewDidLoad
et Également dans Info.plist, définissez UIViewControllerBasedStatusBarAppearance
sur YES
(C'est YES
par défaut)
Il est difficile de comprendre pourquoi cela ne fonctionne pas.J'ai besoin de vérifier le code.Une autre suggestion est Aller avec un code de travail dans viewDidLoad
UIApplication.sharedApplication().statusBarStyle = .LightContent
et changer ceci par défaut lorsque vous visualisez get disparu viewWillDisappear
.
Solution Swift 4.2 avec NavigationController
Premier pas:
Ouvrez votre info.plist et insérez une nouvelle clé nommée "Apparence de la barre d'état basée sur le contrôleur View" ou UIViewControllerBasedStatusBarAppearance
à YES pour permettre à chaque VC d'utiliser sa propre propriété status.
Deuxième étape
Dans chaque VC, remplacez la propriété preferredStatusBarStyle comme ceci:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent //.default for black style
}
Dernière étape
Remplacez la propriété preferredStatusBarStyle dans votre classe NavigationController personnalisée:
class NavigationController : UINavigationController {
override var preferredStatusBarStyle : UIStatusBarStyle {
if let topVC = viewControllers.last {
//return the status property of each VC, look at step 2
return topVC.preferredStatusBarStyle
}
return .default
}
Swift 3
//
// LoginController.Swift
// Swift 3
//
// Created by The Crab on 17/01/2017.
// Copyright © 2017 Paxi Labs. All rights reserved.
//
import UIKit
class LoginController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setNeedsStatusBarAppearanceUpdate()
view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Travaux pour application basée sur la navigation
var addStatusBar = UIView()
addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
self.window?.rootViewController?.view .addSubview(addStatusBar)
Tout est beaucoup plus facile dans Swift 3.0 Xcode 8
En utilisant le code ci-dessous dans le fichier délégué de l'application, après
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
insérez ceci:
UINavigationBar.appearance().barStyle = .black
UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Swift 4 Pour ViewController spécifique sans navigationViewController intégré, ajoutez simplement ceci à votre fichier ViewController.
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
J'avais défini une couleur spécifique (au format RVB) en utilisant le code ci-dessous dans le fichier App Delegate
:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
. . .
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
}
. . .
}
Vous devez également ajouter la clé ci-dessous dans le fichier Info.plist
:
Apparence de la barre d'état basée sur le contrôleur View avec une valeur booléenne définie sur NO
J'ai eu quelques problèmes avec celui-ci. Je ne me sentais pas vraiment content de changer globalement la couleur de la barre d'état dans la vue, puis de la changer à nouveau dans la vue a disparu comme la réponse acceptée. Croyez-le ou non, vous pouvez résoudre ce problème en remplaçant la variable preferredStatusBarStyle
par le contrôleur de vue de votre choix. Après beaucoup de temps, voici ce que j'ai fait pour que cela fonctionne:
info.plist
en YES.preferredStatusBarStyle
.modalPresentationCapturesStatusBarAppearance
sur Oui.De plus, si vous avez des contrôleurs de vue intégrés, comme dans un contrôleur de navigation par exemple, le style de la barre d'état sera demandé au contrôleur de vue le plus haut. Remplacer childViewControllerForStatusBarStyle
et transmettre le contrôleur de vue intégré est supposé fonctionner, mais cela ne s’est pas passé pour moi. Je viens donc de renvoyer la barre d'état préféré des contrôleurs de vue intégrés comme style de barre d'état préféré. Quelque chose comme ça:
override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
Je peux vous suggérer un moyen plus simple,
Appelez cette méthode si les attributs de la barre d'état du contrôleur de la vue, tels que le statut ou le style masqué/non masqué, changent. Si vous appelez cette méthode dans un bloc d'animation, les modifications sont animées avec le reste du bloc d'animation.
Cela a fonctionné pour moi dans iOS 10.1.
Objectif c
[self setNeedsStatusBarAppearanceUpdate];
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
Rapide
setNeedsStatusBarAppearanceUpdate()
var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Je suis surpris que personne ne l'a signalé. Quoi qu'il en soit profiter :)
Ce qui a fonctionné avec moi, dans le story-board, allez au contrôleur de navigation, sélectionnez la barre de navigation, cliquez sur l'inspecteur d'attributs, puis remplacez le style par défaut en noir. C'est tout!
Swift 3.0 Mise à jour
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.statusBarStyle = .lightContent
return true
}
Dans Swift 4 ou 4.2
Vous pouvez ajouter sur votre vc
preferredStatusBarStyle
et définissez la valeur de retour sur
.lightContent ou .default
ex:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Cliquez sur le groupe Fichiers de support (en haut à gauche - nom de votre projet). Accédez à Info. Cliquez sur + quelque part entre les listes, comme ci-dessous le nom du paquet. Ajoutez ensuite "Apparence de la barre d'état du contrôleur View" et réglez-le sur NO . Ouvrez ensuite AppDelegate.Swift et modifiez-le comme suit:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
return true
}
C'est tout.
Fonctionne pour la navigation Basée pour un contrôleur de vue particulier dans Swift4
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
statusbarView.backgroundColor = UIColor.red
view.addSubview(statusbarView)
Pour Xcode 10, vous pouvez créer une classe et la placer avant votre classe viewController, vous pouvez appeler cette classe dans tout contrôleur de vue si une barre d'état de contenu clair est nécessaire ...
class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}
Maintenant changez votre classe viewController en:
class YourViewController: UIViewControllerWithLightStatusBar {
...
}
Et c'est tout...
WARNING
Le setetter pour 'statusBarStyle' était obsolète dans iOS 9.0: Utilisez - [UIViewController preferredStatusBarStyle]
UIApplication.shared.statusBarStyle = .default
donc ma solution était la suivante: créer une extension à partir du contrôleur de navigation:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = presentedViewController{
return topViewController.preferredStatusBarStyle
}
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
}
et si vous avez un viewController qui aura un autre style que celui de l'application, vous pouvez le faire
var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
return barStyle
}
supposons que le style de votre statut d'application soit .default
et que vous souhaitiez que cet écran soit .lightContent
; par conséquent, barStyle utilisera le .lightContent
comme valeur par défaut. Le style de la barre d'état sera alors lightContent, puis assurez-vous que lorsque viewWillDisappear
modifie de nouveau le style bar style de la barre d'état de l'application qui, dans notre cas, est .default
.
cela fonctionne pour moi
Swift 4.2 Hé, je voulais partager une solution qui a fonctionné pour moi et qui vient d’un excellent article de Graig Grummitt sur ce sujet ellusif.
Étape 1 Comme d’autres l’ont mentionné, ajoutez ci-dessous à votre PLIST
View controller-based status bar appearance YES
Étape 2 de l’ajout de RootViewcontroller ci-dessous
var statusBarHidden: Bool = false {
didSet(newValue) {
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
override var prefersStatusBarHidden: Bool {
return statusBarHidden
}
var vcStatusBarStyle: UIStatusBarStyle = .default {
didSet(newValue) {
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return vcStatusbarStyle
}
Lors de la mise à jour de la propriété statusBarHidden
ou vcStatusBarStyle
, elle appelle setNeedsStatusBarAppearanceUpdate()
et met à jour la barre d'état avec les nouvelles valeurs de prefersStatusBarHidden
ou preferredStatusBarStyle
. Dans mon cas, je devais mettre à jour ces propriétés pour le conteneur viewcontroller, qui était le parent du visable childviewcontroller. Je l'ai fait en utilisant une méthode de délégué simple.
protocol MainViewControllerDelegate {
func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
func toggleStatusBar(visable: Bool)
}
Bien sûr, lors de l’instanciation de childViewController (Visible VC), n’oubliez pas de définir MainViewcontroller (conteneur VC) en tant que délégué. Je fais parfois. :)
childViewController.delegate = self
Puis, dans le childViewController, je viens d'appeler la méthode déléguée lorsqu'il est nécessaire de mettre à jour la barre d'état.
self.delegate?.updateStatusBarStyle(statBarStayle: .default)
Comme mentionné ci-dessus, Graig Grummitt décrit plus en détail cette solution et travaille également avec UINavigationControllers. Lien ici: L'affaire mystérieuse de la barre d'état
Un autre moyen très simple de réaliser ce travail consiste simplement à créer une extension de la classe UINavigationController.
Depuis que remplacer la méthode preferredStatusBarStyle:
ne fonctionnera pasÀ MOINS QUEnous le fassions à l’intérieur de la classe UINavigationController.
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
J'ai littéralement eu dans le même problème. Il m'a fallu plus de 4 heures pour le comprendre. J'ai essayé toutes les réponses données ici et le mieux que j'ai obtenu était d'obtenir l'en-tête blanc. Mais les autres éléments, tels que la barre de batterie et d’autres étaient toujours noirs, quoi que j’ai fait: en ce qui concerne l’application de toutes les solutions fournies dans cette question. J'ai donc décidé de revenir en arrière et d'apprendre que j'avais téléchargé une dépendance à CocoaPod qui modifiait les fonctionnalités normales de Xcode et les codes permettant de changer de couleur. Pour moi, c’était la dépendance "ChameleonFramework". Je vous conseillerais donc de vérifier les dépendances que vous avez installées à partir de CocoaPods en supprimant les plus récentes si vous avez appliqué toutes les solutions et que vous ne travaillez pas pour vous.