web-dev-qa-db-fra.com

Comment définir le style de la barre d'état dans Swift 3

J'utilise Xcode 8.0 beta 4.

Dans les versions précédentes, UIViewController avait une méthode pour définir le style de la barre d'état

public func preferredStatusBarStyle() -> UIStatusBarStyle

Cependant, j’ai trouvé que cela changeait en "Get ONLY varaiable" dans Swift 3. 

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Comment peut-on fournir le style à utiliser dans mon UIViewController?

150
Willjay

Ceci est la méthode préférée pour iOS 7 et supérieur

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

Remplacez preferredStatusBarStyle dans chacun de vos contrôleurs de vue . Par exemple:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Si preferredStatusBarStyle renvoie un style de barre d'état préféré différent en fonction de quelque chose qui change dans votre contrôleur de vue (par exemple, si la position de défilement ou si une image affichée est sombre), vous voudrez alors appeler setNeedsStatusBarAppearanceUpdate() lorsque cet état change.

Si vous utilisez un contrôleur de navigation et souhaitez utiliser le style de barre d'état préféré de chaque contrôleur de vue, voir https://stackoverflow.com/a/41026726/1589422 .

iOS avant la version 7, méthode obsolète

Apple a déconseillé cette option , elle sera donc supprimée à l'avenir. Utilisez la méthode ci-dessus pour ne pas avoir à la réécrire lors de la publication de la prochaine version d'iOS.

Si votre application prend en charge Dans le Info.plist de votre application, définissez l'option "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur NO.

Dans appDelegate.Swift, la fonction didFinishLaunchingWithOptions, ajoutez:

UIApplication.shared.statusBarStyle = .lightContent
426
PRAVEEN

Vous pouvez essayer de remplacer la valeur renvoyée plutôt que de la définir. La méthode est déclarée comme {get}, il suffit donc de fournir un getter:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Si vous définissez ceci de manière conditionnelle, vous devrez appeler setNeedsStatusBarAppearanceUpdate() pour qu'il anime le changement lorsque vous êtes prêt.

126
Abizern

Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Pour moi, cette méthode ne fonctionne pas:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

quand j’avais l'habitude de regarder chaque contrôleur, mais cela a fonctionné:

  • Dans le fichier info.list, ajoutez la ligne: View controller-based status bar appearance et définissez la valeur NO

  • Suivant dans appdelegate: 

    UIApplication.shared.statusBarStyle = .lightContent
    
95
Gracu

Vous devez ajouter la clé ci-dessous dans votre fichier Info.plist:

View controller-based status bar appearanceavec une valeur booléenne définie surNO

Dans votre classe appdelegate, dans la méthode didFinishLaunchingWithOptions avant de retourner.

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
    statusBar.backgroundColor = UIColor.red
}
UIApplication.shared.statusBarStyle = .lightContent

changer backgroundColor et statusBarStyle selon les besoins.

25
Himanshu padia

Si vous souhaitez modifier la couleur de la statusBar en blanc, pour toutes les vues contenues dans une UINavigationController, ajoutez ceci à l'intérieur de AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

Ce code:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

not not work pour UIViewControllers contenu dans une UINavigationController, car le compilateur recherche la statusBarStyle de la UINavigationController et non la statusBarStyle de la ViewControllers qu'elle contient.

J'espère que cela aide ceux qui n'ont pas réussi avec la réponse acceptée!

25

Si vous souhaitez modifier le style de la barre d'état à tout moment après l'affichage de la vue, vous pouvez utiliser ceci:

  • Dans le fichier info.list, ajoutez une ligne: Affichez l’apparence de la barre d’état basée sur le contrôleur et réglez-la surYES 

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }
    
22
alex de oliveira

Vous pouvez également le faire dans le storyboard

  1. Créez une nouvelle entrée dans info.plist "Afficher l'apparence de la barre d'état basée sur le contrôleur" et définissez-la sur "OUI".
  2. Accédez à votre scénario, puis sélectionnez le contrôleur de navigation que vous souhaitez modifier. Cliquez sur la barre de navigation de la section de contour du document Storyboard (panneau de gauche sur le storyboard). 
  3. Allez dans le panneau de droite et cliquez sur la section d'attributs
  4. Sous la section Barre de navigation, vous verrez le style. Sélectionnez le style que vous souhaitez (par défaut, le noir et le noir, le blanc)

Vous devrez le faire pour chaque contrôleur de navigation que vous avez. Cependant, toutes les vues sous ce contrôleur de navigation changeront le style/la couleur des barres d’état de la vue à celle que vous venez de sélectionner. Je trouve cette option mieux car vous pouvez voir vos résultats instantanément et vous ne devez pas ajouter de lignes de code supplémentaires dans chaque contrôleur de vue. 

 enter image description here

(Fait avec Xcode 8.3.3 dans un projet entièrement Swift)

12
Bryan Norden

La première étape consiste à ajouter une ligne avec la clé: View controller-based status bar appearance et la valeur NO au fichier Info.plist. Après cela, ajoutez 2 fonctions dans votre contrôleur à seulement ce contrôleur aura les effets suivants: 

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        UIApplication.shared.statusBarStyle = .default    
}
8
javimuu

Swift 3

Dans Info.plist, ajoutez une ligne intitulée "Afficher l'apparence de la barre d'état basée sur le contrôleur" et définissez sa valeur sur No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarStyle = .lightContent //or .default
        setNeedsStatusBarAppearanceUpdate()

    }

}
6
youareawaitress

Il semble y avoir un petit problème concernant la couleur du texte de la barre d’état lorsqu’il s’agit de barres de navigation.

Si vous voulez que l'apparence de la barre d'état basée sur le contrôleur Vue de l'entrée .plist soit définie sur YES, cela ne fonctionnera parfois pas si vous avez une barre de navigation colorée.

Par exemple:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

et

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

Le code ci-dessus ne fonctionnera pas même si vous avez défini les éléments suivants dans AppDelegate:

UIApplication.shared.statusBarStyle = .lightContent

Pour ceux qui luttent encore, apparemment, le style de la barre d'état doit être clair ou sombre en fonction des styles de la barre de navigation. J'ai donc réussi à résoudre ce problème en ajoutant la ligne suivante dans viewWillAppear:

nav?.barStyle = UIBarStyle.black

Lorsque le style de barre est noir, il écoute votre variable remplacée. J'espère que ça aide quelqu'un :)

5
nCr78

Xcode 8.3.1, Swift 3.1

  1. Créez une nouvelle entrée dans info.plist "Afficher l'apparence de la barre d'état basée sur le contrôleur" et réglez-la sur "NON".

  2. Ouvrez AppDelegate.Swift et ajoutez ces lignes à la méthode "didFinishLaunchingWithOptions":

application.statusBarStyle = .lightContent

5
joemalski

Swift 4.0 Veuillez utiliser ce code dans "didFinishLaunchingWithOptions launchOptions:" Appdelegate class

UIApplication.shared.statusBarStyle = .lightContent
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){
  statusBar.backgroundColor = UIColor.black
}
4
Karthickkck

Voici Directives/Instructions Apple à propos du changement de style de la barre d’état.

Si vous souhaitez définir le style de la barre d'état, le niveau de l'application, définissez UIViewControllerBasedStatusBarAppearance sur NO dans votre fichier .plist. Et dans votre appdelegate> didFinishLaunchingWithOptions, ajoutez le suivant (par programme, vous pouvez le faire à partir du délégué de l'application).

Objectif c 

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

Rapide

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

si vous souhaitez définir le style de la barre d'état, au niveau du contrôleur de vue, procédez comme suit:

  1. Définissez UIViewControllerBasedStatusBarAppearance sur YES dans le fichier .plist, si vous devez définir le style de la barre d'état au niveau UIViewController uniquement. 
  2. Dans la fonction d'ajout viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. écrasez preferredStatusBarStyle dans votre contrôleur de vue.

Objectif c

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Rapide

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Définissez la valeur de .plist en fonction du niveau de configuration du style de la barre d'état.

enter image description here

4
Krunal
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Cela a fonctionné pour moi :) J'ai un contrôleur de navigation intégré dans mes contrôleurs de vue avec une barre de navigation masquée. Je voulais allumer la barre de statut sur certaines des applications de viewsin.

3
Deepa Suryawanshi

Swift 3

si l'apparence de la barre d'état basée sur le contrôleur View = YES dans Info.plist

puis utilisez cette extension pour tous les NavigationController

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

s'il n'y a pas d'UINavigationController et que vous ne disposez que d'UIViewController, utilisez le code ci-dessous:

    extension UIViewController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }
3
Datt Patel

Cela a fonctionné pour moi

Définissez l'apparence de View controller-based status bar dansNOdans la pliste, puis dans Dans UIViewControllerviewDidAppear vient d'ajouter la ligne suivante 

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
3
Anshad Rasheed

Pour les personnes souhaitant modifier la barre d'état de tous les contrôleurs de vue sous: iOS 11, la solution Swfit 4 est assez simple.

1) Info.plist ajouter: 

Afficher l'apparence de la barre d'état basée sur le contrôleur -> NON

2) Côté gauche du projet de sélection XCode> Cibles > Sélectionnez votre projet> Sous Général> Infos de déploiement> Sélectionner un style de barre d'état: Léger

Si vous souhaitez modifier la barre d'état uniquement pour un contrôleur de vue , dans viewDidLoad, ajoutez:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
3
Doca

Swift 4+

pour le texte de la barre d'état blanche:

navigationController.navigationBar.barStyle = .blackTranslucent
2
Alfi

Vous pouvez utiliser une propriété bool nommée "shouldStatusBarDark" pour changer la couleur de votre barre d'état. Et vous pouvez également mettre à jour sa valeur pour changer la couleur de la barre d'état lorsque vous faites défiler.

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }
2
tiantong

La plupart de ces réponses sont identiques, mais aucune d’entre elles n’adresse réellement l’écran de lancement lorsque j’utilise un arrière-plan sombre. 

Je contournais cela avec ce qui suit dans mon info.plist qui produisait une barre d'état de style clair.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
2
CodeBender

Si vous utilisez une présentation modale, vous devez définir:

viewController.modalPresentationCapturesStatusBarAppearance = true
1
RomanMisnikov

Pour ajouter à la grande réponse de @Krunal https://stackoverflow.com/a/49552326/4697535

Si vous utilisez un UINavigationController, le preferredStatusBarStyle n'aura aucun effet sur le UIViewController

Xcode 10 et Swift 4.

Définir une UINavigationController personnalisée

Exemple:

class LightNavigationController: UINavigationController {

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

Utilisez une extension pour une solution au niveau de l'application:

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}
1
Tal Zion

Xcode 10 ou plus tard

Aucun code requis, suivez simplement les étapes ci-dessous.

Si vous souhaitez modifier la barre d'état dans toute l'application.

  1. Sélectionnez Project dans Project Navigator (panneau latéral gauche).
  2. Sélectionnez la cible.
  3. Sélectionnez l'onglet Général.
  4. Trouver des informations de déploiement.
  5. Modifier le style de la barre d'état en Clair (pour un fond sombre "Clair" , un fond clair "Par défaut" )

N'oubliez pas les modifications de info.plist

  1. Sélectionnez l'onglet Info
  2. Ajoutez cette clé dans votre fichier plist "Afficher l’apparence de la barre d’état basée sur le contrôleur" = NO

Exécutez votre projet et vérifiez-le.

Mon projet dans Swift 5 et Xcode 10.2

1
Vivek

iOS 11.2

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .black

    return true
}
1
Satish Babariya

S'il vous plaît ajoutez la ligne suivante dans votre info.plist alors vous seul pouvez y arriver

"Afficher l'apparence de la barre d'état basée sur le contrôleur = NON"

Et ajoutez l'extrait de code suivant dans votre code et consultez le résultat

        UIApplication.shared.statusBarStyle = .lightContent
        UIApplication.shared.statusBarStyle = .default
0
Nrv

Pour Objective C, ajoutez simplement cette ligne à votre application. Méthode didFinishLaunch

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
0
Asfand Shabbir

Je devenais:

La variable de substitution doit être aussi accessible que son type englobant

Ce qui est corrigé en ajoutant public comme:

override public var preferredStatusBarStyle: UIStatusBarStyle {
    get {
        return .lightContent
    }
}

Sur Swift3 iOS10.

0
James BH

Si vous recevez l'avertissement: Le Setter pour 'statusBarStyle' était obsolète dans iOS 9.0: Utilisez - [UIViewController preferredStatusBarStyle] , puis définissez la barre d'état sur claire ou sombre, utilisez le code suivant:

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

Cela ne fera pas que votre barre de navigation change, elle indique simplement le style et change donc la barre d'état en conséquence.

NB Vous devez vous assurer que vous avez défini votre info.plist.

View controller-based status bar appearance to YES
0
Richard Hope

en utilisant WebkitView

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.Apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}
0
Oracular Man