web-dev-qa-db-fra.com

Modification de la couleur de la barre d'état pour ViewControllers spécifique utilisant Swift dans iOS8

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?

150
Anuj

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

325
Anuj

(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
}
56
BennyTheNerd

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)
15
Nikita Khandelwal

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)

Swift 3

Extension:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

La mise en oeuvre:

UIApplication.statusBarBackgroundColor = .blue
14
John R Perry
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()
    }

}
13
A.G

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. 

11
Chris Tsitsaris

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()
    }
11
A.J. Hernandez

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
    }
8
Giang

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.

 enter image description here

Stars View Controller est une CPBaseNavigationController et CPBaseNavigationController est une sous-classe de UINavigationController.

J'essaie de faire les prochaines étapes:

  1. Dans AppDelegate.Swift func didFinishLaunchingWithOptions, ajoutez 

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    mais pas d'effet.

  2. 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.

 enter image description here

  1. 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].

7
wenghengcong

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 viewDidLoadUIApplication.sharedApplication().statusBarStyle = .LightContent et changer ceci par défaut lorsque vous visualisez get disparu viewWillDisappear.

7
codester

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
}
7
guillama

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
    }
}
6
theCrab

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)
6
Jio

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)
6
Anton Russia

Swift 4 Pour ViewController spécifique sans navigationViewController intégré, ajoutez simplement ceci à votre fichier ViewController. 

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
5
Surjit Singh

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

 Screenshot 1

 Screenshot 2

3
Jayprakash Dubey

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:

  1. Changez l’apparence de la barre d’état basée sur le contrôleur View dans votre info.plist en YES.
  2. Désormais, tout contrôleur d'affichage en plein écran peut modifier le style de la barre d'état en remplaçant preferredStatusBarStyle.
  3. Je spécifie plein écran parce que cela ne fonctionnera pas pour les contrôleurs de vue modale (non plein écran), non sans régler modal​Presentation​Captures​Status​Bar​Appearance sur Oui.
  4. 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 child​View​Controller​For​Status​Bar​Style 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
    }
    
2
John C.

Je peux vous suggérer un moyen plus simple,

  1. Il suffit d'appeler setNeedsStatusBarAppearanceUpdate in viewDidLoad comme le dit la documentation Apple, 

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.

  1. Implémentez preferredStatusBarStyle en retournant votre type préféré.

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 :)

2
Bhaumik Desai

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!

1
Amr

Swift 3.0 Mise à jour

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
1
Jaseibert

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
}
1
Ridho Octanio

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.

0
Goran Jakovljevic

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)
0

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...

0
Fabio

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

0
hesham ghalaab

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

0
Erik Uecke

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
}

}

0
azemi

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. 

0
Martin Q