Modification de la couleur de la barre d'état pour des ViewControllers spécifiques à l'aide de Swift dans iOS8


193
override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

L'utilisation du code ci-dessus dans n'importe quel ViewController pour définir la couleur statusBar sur Blanc pour un viewcontroller spécifique ne 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 simplement modifier la couleur de la barre d'état pour certains ViewControllers requis et spécifiques ?

Réponses:


349

Après avoir lu toutes les suggestions et essayé quelques choses, je pourrais faire fonctionner cela pour des contrôleurs de vue spécifiques en utilisant les étapes suivantes:

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 " sur NON

Deuxième étape (juste une explication, pas besoin de mettre en œuvre ceci):

Normalement, nous mettons le code suivant dans l'application (méthode _: didFinishLaunchingWithOptions :) de l'AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

mais cela affecte le statusBarStylede tous les ViewControllers.

Alors, comment faire fonctionner cela pour des ViewControllers spécifiques - Étape finale:

Ouvrez le fichier viewcontroller dans lequel vous souhaitez modifier statusBarStyleet mettez le code suivant viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

En outre, implémentez la viewWillDisappear()méthode 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 le statusBarStylepour le contrôleur de vue spécifique, puis defaultle redéfinit en lorsque le contrôleur de vue spécifique disparaît. Ne pas mettre en œuvre le viewWillDisappear()changera statusBarStyledéfinitivement la nouvelle valeur définie deUIStatusBarStyle.LightContent


4
Notez que si vous définissez Status bar is initially hidden = YESdans le fichier info.plist, "Afficher l'apparence de la barre d'état basée sur le contrôleur = NON" provoquera le masquage de la barre d'état.
xi.lin

13
Si vous revenez à UIStatusBarStyle.Defaultutiliser viewWillDisappear(), vous devriez l'utiliser viewWillAppear()pour l'initialiser, plutôt que viewDidLoad().... sinon, si vous revenez à cette vue sans avoir à la recharger, vous ne verrez pas ce que StatusBarStylevous attendez.
William GP

7
Pour Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz

4
On ne sait toujours pas comment changer la couleur de la barre d'état
DoruChidean

4
Guys, son obsolète à partir d'iOS 9
parJeevan

109

(Au 20 septembre 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}

7
Assurez-vous d'appeler super.viewWillAppearsi vous copiez et collez ce code
Stephen Silber

Modifié pour inclure super.viewWillAppear (). Merci @StephenSilber pour le tuyau!
BennyTheNerd

vous devez remplacer le favoriteStatusStyle ou cela ne fonctionnera pas. Merci d'avoir fait remarquer cela. +1
Alix

3
Utilisation des UIApplication.shared.statusBarStyle = .lightContentrésultats dans cet avertissement du compilateur: Setter pour 'statusBarStyle' était obsolète dans iOS 9.0: Utilisation - [UIViewController favoriteStatusBarStyle]
airowe

3
Dans Info.plist de votre application, définissez "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur OUI
IvanPavliuk

31

Solution Swift 4.2 avec NavigationController

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 » ou UIViewControllerBasedStatusBarAppearancesur YES pour permettre à chaque VC d'utiliser sa propre propriété d'état.

Deuxième étape

Dans chaque VC, remplacez la propriété favoriteStatusBarStyle comme ceci:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

Dernière étape

Remplacez la propriété favoriteStatusBarStyle 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
}

Ce n'est que la manière d'obtenir le résultat attendu en utilisant le contrôleur de navigation et vos propres contrôleurs. Vous pouvez également faire de cette façon pour prefersStatusBarHidden comme je l'ai fait pour mon projet :)
atereshkov

29

J'ai suivi ce tutoriel et cela a fonctionné pour moi. Cependant, je ne sais pas s'il y a des mises en garde.

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • Ouvrez votre info.plist et définissez-le UIViewControllerBasedStatusBarAppearancesur false.
  • Dans la première fonction de AppDelegate.swift, qui contient didFinishLaunchingWithOptions, définissez la couleur souhaitée.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Mise à jour Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent


11
en quoi est-ce spécifique à chaque contrôleur de vue
Yarneo

4
Exactement, c'est pour l'application complète, et ce n'est pas la question.
Anuj

3
J'utilise iOS 8 Swift et xCode 6.1.1 et le simple fait de suivre ces deux étapes ne fonctionne pas. Vous devez également ajouter UIApplication.sharedApplication().statusBarHidden = falseà AppDelegate.swift didFinishLauchingWithOptions
Ahmad Amin

Cela l'a défini pour l'ensemble de l'application. Pour les contrôleurs de vue spécifiques, voir la première réponse. Cela a fonctionné pour moi.
Akshar Patel le

Setter pour «statusBarStyle» est obsolète dans iOS 9.0: Utilisation - [UIViewController favoriteStatusBarStyle]
Oleksandr

22

Il y a un milliard de réponses ici alors j'ai pensé pourquoi ne pas en ajouter une autre sous la forme d'une 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

2
Veuillez noter que cette approche peut être considérée comme un accès à une API privée et peut signifier que votre application sera rejetée par Apple.
JWhitey

Ou du moins, cela dépend des détails de mise en œuvre d'Apple et peut se rompre sans avertissement avec les modifications apportées à iOS.
Chris Prince

19

Dans votre Info.plist, vous devez définir l'apparence de la barre d'état basée sur le contrôleur de vue sur n'importe quelle valeur.

Si vous le définissez OUI, vous devez remplacer la fonction favoriteStatusBarStyle dans chaque contrôleur de vue.

Si vous le définissez NON, vous pouvez définir le style dans AppDelegate en utilisant

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

7
setStatusBarStyleest obsolète dans iOS 9.0
Jeffrey Neo

@Jeffrey_Neo Bien que ce soit vrai, je ne peux pas faire fonctionner le remplacement. Il serait utile de voir votre commentaire comme une réponse avec un code fonctionnel.
dumbledad

15
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()
    }

}

l'utilisation valueForKey("statusBar")peut ne pas être conforme aux directives Apple
Cœur

15

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.


3
UIView répond toujours à backgroundColor dans Swift.
Cœur

13

SWIFT 2

J'ai réussi à changer l'apparence de l'arrière-plan de la barre d'état en ajoutant ce qui suit dans ma vue

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }

10

Mettre en œuvre preferredStatusBarStyleque vous avez mentionné et appel self.setNeedsStatusBarAppearanceUpdate()à ViewDidLoadet aussi dans le jeu Info.plist UIViewControllerBasedStatusBarAppearanceà YES(Il est YESpar défaut)

On ne sait pas pourquoi cela ne fonctionne pas.Je dois vérifier le code.Une autre suggestion est d'aller avec le code de travail viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContentet de le modifier par défaut lorsque vous voyez disparaître viewWillDisappear.


La mise en œuvre de la première partie de la réponse a fonctionné pour moi. Cependant, je n'ai pas ajouté le UIViewcontrollerBasedStatusBarAppearance dans Info.plist. Cela fonctionnait toujours.
Akshar Patel

10

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
    }

1
J'ai essayé toutes les solutions ... cela n'a fonctionné que pour moi !! Je ne sais pas pourquoi: D
Khaled Hayek

chance du tirage au sort
Giang

Setter pour 'isStatusBarHidden' est obsolète dans iOS 9.0: Utilisation - [UIViewController prefersStatusBarHidden] ...
dessiné ..

9

Dans ma situation, j'utilise le storyboard pour organiser mes contrôleurs de vue.Je souhaite modifier tous les styles de barre d'état.

Vous pouvez voir l'image ci-dessous.

entrez la description de l'image ici

StarsView Controller est un CPBaseNavigationController, et CPBaseNavigationControllerest sous - classe de UINavigationController.

J'essaye de faire les prochains sets:

  1. Dans AppDelegate.swiftfunc didFinishLaunchingWithOptions, ajoutez

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

    mais aucun effet.

  2. Dans StoryBoard, recherchez le Base Tab BarController(image ci-dessus) .select Attributes Inspector, changez l' Sattus Barattribut en Light Content.so bad, aucun effet.

entrez la description de l'image ici

  1. Dernier je l'obtiens.Dans mon contrôleur de navigation personnalisé CPBaseNavigationController, ajoutez funcpreferredStatusBarStyle

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }

    Ça marche bien!

En outre, statusBarStyleobsolète dans la version 9.0, vous pouvez utiliser -[UIViewController preferredStatusBarStyle].


9

Fonctionne pour une 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)

Où ajouter ce code spécifique, je ne pouvais tout simplement pas faire fonctionner cela.
Anuj

Vous pouvez l'ajouter dans le fichier de délégué d'application dans didFinishLaunchingWithOptions
Jio

1
Ne serait-il pas préférable d'utiliser addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) au lieu de la largeur 320 codée en dur?
Torsten Ojaperv

Édité @TorstenOjaperv
Jio

Comment le faire avec Swift 3.0?
YETI

8

Tout est beaucoup plus facile dans Swift 3.0 Xcode 8

En utilisant le code ci-dessous dans le fichier App Delegate, 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)

1
Les valeurs du rouge, du vert et du bleu sont comprises entre 0 et 1. Vous devez les diviser par 255 sinon cela ne fonctionnera pas.
Makalele

8

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

7

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

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Si nous avons un contrôleur de navigation intégré, que faites-vous?
icekomo

7

Un autre moyen très simple de faire ce travail consiste simplement à créer une extension de la classe UINavigationController.

Étant donné que le remplacement de la preferredStatusBarStyle:méthode ne fonctionnera pas, SAUF, nous le faisons à l'intérieur de la classe UINavigationController.

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }

4

J'avais défini une couleur spécifique (au format RVB) en utilisant le code ci-dessous dans le App Delegatefichier:

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 Info.plistfichier:

Afficher l'apparence de la barre d'état basée sur le contrôleur avec la valeur booléenne définie sur NON

Capture d'écran 1

Capture d'écran 2


Avec Siwft 3.0, comment faire?
YETI

4

Je peux vous suggérer un moyen plus simple,

  1. Appelez simplement setNeedsStatusBarAppearanceUpdate dans viewDidLoad comme le dit la documentation Apple,

Appelez cette méthode si les attributs de la barre d'état du contrôleur de vue, tels que l'état 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 la méthode favoriteStatusBarStyle en renvoyant 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'ait signalé. En tout cas profitez-en :)


4

J'ai eu quelques problèmes avec celui-ci. Je ne me sentais pas vraiment bien à l'idée de changer globalement la couleur de la barre d'état dans la vue, puis de la changer à nouveau à la vue a disparu comme la réponse acceptée. Croyez-le ou non, vous pouvez faire fonctionner cela en remplaçant preferredStatusBarStylele contrôleur de vue souhaité. Après beaucoup de temps, voici ce que j'ai fait pour le faire fonctionner:

  1. Changez l'apparence de la barre d'état basée sur le contrôleur de vue dans votre info.plistsur OUI.
  2. Désormais, n'importe quel contrôleur de vue plein écran peut modifier le style de la barre d'état en remplaçant preferredStatusBarStyle.
  3. Je spécifie le plein écran car cela ne fonctionnera pas pour les contrôleurs de vue modale (non plein écran), non sans le réglage modal​Presentation​Captures​Status​Bar​Appearancesur Oui.
  4. De plus, si vous avez des contrôleurs de vue intégrés, comme dans un contrôleur de navigation par exemple, il demandera au contrôleur de vue le plus haut le style de la barre d'état. Remplacer child​View​Controller​For​Status​Bar​Styleet passer le contrôleur de vue intégré est censé fonctionner, mais ce n'est pas le cas pour moi. Je viens donc de renvoyer la barre d'état préférée 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
    }

Cette réponse m'a aidé! J'ai trouvé que pour une raison quelconque, mon contrôleur de navigation (présenté de manière modale) ne demandait pas implicitement au contrôleur de vue le plus haut son style de barre d'état. J'ai donc dû sous UINavigationController-classer et remplacer le child​View​Controller​For​Status​Bar​Stylevar là-dedans, en revenant self.topViewController.
taber le

3

Dans Swift 4 ou 4.2

Vous pouvez ajouter sur votre vc

préféréStatusBarStyle

et définissez la valeur de retour sur

.lightContent ou .default

ex:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

3

(Au 10 juin 2020)

Swift 5 ( sans .Plistfichier d' édition )

Si vous utilisez Storyboard, accédez au NavigationController, sélectionnez le navigationBar, cliquez sur Attributes Inspector, puis modifiez le style. si vous avez besoin de light content( barre d'état blanche ), définissez-le quoi que ce soit sauf defaultdisons définir le style blackEt si vous voulez dark content ( barre d'état noire ), réglez-le default.

La valeur par défaut ( UIBarStyleDefault) entraîne la UIStatusBarStyleDefaultbarre d'état sombre au premier plan . Et UIBarStyleBlackdonnera une UIStatusBarStyleLightContentbarre d'état.

Par programme

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Sans barre de navigation ( Modifier.Plist )

ajoutez UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearanceà votre info.plist, et la valeur définie est true.

Overridela preferredStatusBarStylepropriété dans votre contrôleur

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}

2

Mise à jour Swift 3.0

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

2

Ce qui a fonctionné avec moi, dans le Storyboard, allez dans le contrôleur de navigation, sélectionnez la barre de navigation, cliquez sur l'inspecteur d'attributs, puis changez le style par défaut en noir. C'est tout!


2

SWIFT 4.2 Hé, je voulais partager une solution, qui a fonctionné pour moi, que j'ai obtenue d'un excellent article sur ce sujet ellusif de Graig Grummitt.

Étape 1 Comme d'autres l'ont mentionné, ajoutez ci-dessous à votre PLIST

View controller-based status bar appearance YES

Étape 2 dans 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 l'une des propriétés statusBarHiddenou, vcStatusBarStyleil appellera setNeedsStatusBarAppearanceUpdate()et mettra à jour la barre d'état avec les nouvelles valeurs pour prefersStatusBarHiddenou preferredStatusBarStyle. Dans ma situation, j'ai dû mettre à jour ces propriétés pour le conteneur viewcontroller, qui était le parent du childviewcontroller visible. 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 du childViewController (Visible VC), n'oubliez pas de définir MainViewcontroller (Container VC) comme son délégué. Je fais parfois. :)

childViewController.delegate = self

Ensuite, dans le childViewController, je viens d'appeler la méthode de délégué lorsque cela est nécessaire pour mettre à jour la barre d'état.

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

Comme mentionné ci-dessus, Graig Grummitt donne plus de détails sur cette solution et travaille également avec UINavigationControllers. Lien ici: Le cas mystérieux de la barre d'état


1

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 bundle. Et ajoutez "Afficher l'apparence de la barre d'état basée sur le contrôleur" et réglez-le sur NON. Ensuite, ouvrez AppDelegate.swift et modifiez-le comme ceci:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

return true
}

C'est tout.


Vous avez mal lu la question. J'ai demandé comment changer le StatusBarStyle pour des contrôleurs de vue spécifiques, pas pour l'application complète.
Anuj

Vérifiez ma réponse ci-dessous @Anuj
theCrab

1

Pour Xcode 10, vous pouvez créer une classe et la mettre avant votre classe viewController, vous pouvez appeler cette classe dans tout le contrôleur de vue est nécessaire une barre d'état du contenu léger ...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

Modifiez maintenant votre classe viewController dans:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

Et c'est tout...


1

Fonctionne pour la navigation basée sur 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)

1

AVERTISSEMENT


Le Setter pour 'statusBarStyle' était obsolète dans iOS 9.0: Utilisation - [UIViewController favoriteStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

ma solution était donc 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 le style de l'application, vous pouvez faire ceci

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

disons que le style d'état de votre application est .defaultet que vous voulez que cet écran soit .lightContent tel que barStyle prendra .lightContentcomme valeur par défaut, cela changera le style de la barre d'état en lightContent, puis assurez-vous que lorsque vous viewWillDisappearchangez à nouveau le style barStyle en style de barre d'état de l'application ce qui dans notre cas est .default.

cela fonctionne pour moi


1

Couleur personnalisée pour la barre d'état (iOS11 +, Swift4 +)

Si vous recherchez une solution pour changer la barre d'état en votre couleur personnalisée, c'est la solution de travail.

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.