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

186

J'utilise Xcode 8.0 beta 4.

Dans la version précédente, UIViewController a une méthode pour définir le style de la barre d'état

public func preferredStatusBarStyle() -> UIStatusBarStyle

Cependant, je l'ai trouvé changé en "Get ONLY varaiable" dans Swift 3.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Comment puis-je fournir le style à utiliser dans mon UIViewController?

Willjay
la source
essayez cette var favoriteStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Réponses:

485

[MISE À JOUR] Pour Xcode 10+ et Swift 4.2+

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

Dans votre application Info.plist, définissez View controller-based status bar appearancesur YES.

Remplacer preferredStatusBarStyle ( documents Apple ) dans chacun de vos contrôleurs de vue. Par exemple:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

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

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

Apple l'a désapprouvé , il sera donc supprimé à l'avenir. Utilisez la méthode ci-dessus pour ne pas avoir à le réécrire lors de la sortie de la prochaine version iOS.

Si votre application prend en charge dans votre application Info.plist, définissez View controller-based status bar appearancesur NO.

Dans appDelegate.swift, la didFinishLaunchingWithOptionsfonction, ajoutez:

UIApplication.shared.statusBarStyle = .lightContent

Pour le contrôleur de navigation

Si vous utilisez un contrôleur de navigation et vous voulez que l'état style préféré de barre de chaque contrôleur de vue à utiliser et mettre View controller-based status bar appearanceà YESvos applications de lainfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}
PRAVEEN
la source
3
Travaille pour moi. J'ai oublié d'insérer d'abord le nouveau paramètre dans Info.plist.
falsecrypt
1
@LightMan the uiapplication statusBarStyle n'est pas obsolète, je l'ai utilisé dans iOS 11 et cela fonctionne.
Sushobhit
1
@Sushobhit setStatusBarStyle était obsolète dans iOS 9, tel qu'utilisé dans cette réponse. Mais vous avez toujours UIApplication.statusBarStyle en tant que propriété en lecture seule.
LightMan
1
Il y a des moments où vous souhaitez pouvoir le définir par programme en raison de la couleur de chaque vue.
Alejandro Cavazos
9
Vous pouvez également supprimer la ligne dans appDelegate.swift et aller à Target -> General -> Deployment Info -> Status Bar Style -> Light
Robert Veringa
162

Dernière mise à jour (Xcode 10+ / Swift 4.2+)

Cet article est laissé intact pour quiconque souhaite comprendre la logique derrière les différentes approches qui étaient présentes depuis plusieurs années. Pendant ce temps, à partir de Xcode 10, la première approche de Swift 4.2 est obsolète et n'est plus prise en charge (c'est -à- dire qu'elle ne prendra pas effet si vous essayez de l'utiliser). Il est toujours référé pour votre information afin de mieux comprendre le raisonnement derrière le Plist.infodrapeau et la pratique de personnalisation.

Précision importante

Il est très important de comprendre deux approches pour personnaliser l'apparence de la barre d'état. Ils sont différents et ne doivent pas être mélangés.

Première approche - une couleur pour l'ensemble de l'application (obsolète depuis iOS7)

Dans info.plist, vous trouvez ou créez une clé appelée

View controller-based status bar appearance

et réglez-le sur NON .

Ce qu'il fait? Il établit essentiellement un paramètre qui indique que dans votre application, l'apparence de la barre d'état n'est pas définie individuellement par chaque contrôleur de vue . C'est très important à comprendre. Cela signifie que vous avez un réglage uniforme pour toute l'application, pour tous les écrans. Il existe deux paramètres:, defaultqui est du texte noir sur fond blanc, ou lightContent, qui est du texte blanc sur fond noir.

Pour définir l'un de ces paramètres ( un paramètre 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 que cela fonctionne, accédez à info.plist et définissez

View controller-based status bar appearance

à OUI

De cette façon, 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 UIViewControllerinstance dont vous avez besoin:

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

Vous avez le même que dans le premier, définissez le 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:

  1. Lors de l'initialisation de l'écran, lorsque l'interface utilisateur est en cours de préparation.
  2. En appelant setNeedsStatusBarAppearanceUpdate()le code.

Dans ce dernier cas, vous êtes autorisé à manipuler l'apparence de la barre d'état avec 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 y a 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 le noir ou le blanc, vous utilisez une API non documentée. Vous obtenez un statusBarobjet en utilisant KVC et définissez sa couleur d'arrière-plan. L'objet que vous obtenez de cette façon est UIStatusBar, qui est dérivé de UIViewet prend donc naturellement en charge la backgroundColorpropriété. C'est un moyen sale, pas légal, mais jusqu'à présent, c'est le seul moyen de configurer une couleur personnalisée pour la barre d'état (sans prendre en compte l' UINavigationBarapproche, qui permet de personnaliser complètement l'apparence de la barre de navigation + de la barre d'état). Cela pourrait bien conduire votre application à être rejetée. Mais peut-être que vous avez de la chance. Et si vous l'êtes, dans certaines circonstances complexes (comme la hiérarchie des contrôleurs imbriqués, de navigation enfant et de vue), cela peut être à peu près le seul, ou du moins le moyen le moins gênant 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 devrait laisser chaque contrôleur de vue définir l'apparence de la barre d'état, en définissant l'indicateur sur OUI (ou en omettant cette action, car c'est OUI par défaut) et en suivant les instructions ci-dessus.


Prime

Solution basée sur le piratage que vous pouvez (bien que non 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 une approche régulière. 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")
        }
    }
}
Hexfire
la source
2
Une fois que vous avez la barre d'état, vous pouvez également faire ceci: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); ou utilisez une clé existante pour définir toute propriété disponible pour UIStatusBar mais pas pour UIView
Mark
application.statusBarStyle = .lightContent cette approche est en général depuis iOS9> Setter pour 'statusBarStyle' a été dépréciée dans iOS 9.0: Utilisez - [UIViewController preferredStatusBarStyle] l'attente d'aller est pour UIViewController
toxicsun
C'est le seul qui fonctionne ici lors du changement de thème de couleur de l'application. Cependant, il semble qu'une fois que cela a été défini, vous devez toujours le réinitialiser lorsque vous changez de contrôleur de vue. La méthode favoriteStatusBarStyle () est désormais ignorée (même avec le paramètre approprié dans info.plist).
automatique
2
Cette réponse est plus descriptive que d'autres.
ViruMax
2
La solution bonus est cassée dans iOS 13.1
ViruMax
130

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}, alors fournissez simplement un getter:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Si vous définissez cela de manière conditionnelle, vous devrez appeler setNeedsStatusBarAppearanceUpdate()pour animer le changement lorsque vous serez prêt

Abizern
la source
2
C'est une meilleure approche que vous pouvez choisir prefersStatusBarHiddenpour certaines de vos vues. Si vous allez avec, UIApplication.shared.statusBarStylevous serez coincé avec.
superarts.org
105

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'utilisais chaque contrôleur de vue, mais cela fonctionnait:

  • Dans le fichier info.list, ajoutez une ligne: View controller-based status bar appearanceet définissez surNO

  • Suivant dans appdelegate:

    UIApplication.shared.statusBarStyle = .lightContent
Gracu
la source
J'essayais seulement après avoir ajouté du code au délégué d'application, mais le paramètre info plist m'a été utile. Merci
Akhilesh Sharma
6
Setter pour «statusBarStyle» est obsolète dans iOS 9.0: Utilisation - [UIViewController favoriteStatusBarStyle]
Reimond Hill
33

Si vous voulez changer la statusBarcouleur de la en blanc, pour toutes les vues contenues dans a UINavigationController, ajoutez ceci à l'intérieur 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
}

ne fonctionne pas pour le UIViewControllerscontenu dans a UINavigationController, car le compilateur recherche le statusBarStylede UINavigationController, pas le statusBarStylede le ViewControllerscontenu par lui.

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

M. Xcoder
la source
Oui, merci beaucoup! Le contrôleur de navigation était une petite nuance que beaucoup n'ont pas envisagée!
Alexis Candelaria
26

Si vous souhaitez modifier le style de la barre d'état à tout moment après l'apparition 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 définissez-la sur OUI

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }
alex de oliveira
la source
1
EtIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G
26

Xcode 10 ou version ultérieure

Testé dans Swift 5

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

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

  1. Sélectionnez Projet dans le navigateur de projet (panneau de gauche).
  2. Sélectionnez la cible.
  3. Sélectionnez l'onglet Général.
  4. Trouvez les informations de déploiement.
  5. Remplacez le style de la barre d'état par Clair (pour un fond sombre "Clair" , un fond clair "Par défaut" )

N'oubliez pas les modifications apportées à 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" = NON

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

Mon projet dans Swift 5 et Xcode 10.2 & 11.0

Vivek
la source
Pour Xcode 10 / Swift5, cela devrait être la réponse acceptée. Vous devez suivre les DEUX étapes pour que cela fonctionne.
John Robi
Parfait. Je vous remercie! Je conviens que cela devrait être la réponse réellement acceptée.
DungeonDev
C'est la réponse parfaite 🤟🏻
nikhilgohil11
Cela fonctionne totalement aussi pour xcode 11 avec swift 5, merci
Luis Santiago
25

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

View controller-based status bar appearance avec une valeur booléenne définie sur NO

Dans votre classe appdelegate, dans la didFinishLaunchingWithOptionsméthode avant le retour.

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

changement backgroundColoret statusBarStyleselon l'exigence.

Himanshu padia
la source
Bonne solution, mais est-ce que cela compte comme utiliser une API privée?
GoldenJoe
Fonctionne bien mais comment puis-je changer ma couleur personnalisée?
iSrinivasan27
@MohanSrinivasan au lieu de "UIColor.red" vous pouvez spécifier votre couleur personnalisée.
Himanshu padia
13

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 réglez-la sur "OUI".
  2. Accédez à votre storyboard, puis sélectionnez le contrôleur de navigation que vous souhaitez modifier. Cliquez sur la barre de navigation dans la section Contour du document Storyboard (panneau de gauche du storyboard)
  3. Allez dans le panneau de droite et cliquez sur la section des attributs
  4. Sous la section Barre de navigation, vous verrez le style. Sélectionnez le style que vous souhaitez (par défaut pour le noir et le noir pour le blanc)

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

entrez la description de l'image ici

(Fait avec Xcode 8.3.3 dans un projet tout Swift)

Bryan Norden
la source
"Afficher l'apparence de la barre d'état basée sur le contrôleur" devrait être réglé sur "NON"
Willjay
2
Une manière très propre de définir le style de la barre d'état en fonction du contenu de View Controller, ce qui est la bonne manière au lieu de simplement définir View controller-based status bar appearance = NOet de ne devoir utiliser que le style clair ou foncé dans toute l'application. C'est dommage que cette méthode "sans code" ne fonctionne que dans Navigation Controller, Apple devrait envisager d'ajouter un autre champ pour définir cette option dans n'importe quelle instance de View Controller.
aldoram5
12

Pour les personnes souhaitant changer la barre d'état de tous les contrôleurs d'affichage sur: iOS 11, la solution Swfit 4/5 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 XCode slect> Cibles > Sélectionnez votre projet> Sous Général> Informations de déploiement> Sélectionnez le style de barre d'état: Lumière

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

2.1 ) Info.plist

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

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Objective-C (ou réagir natif) changeant depuis App Delegate:

1) Info.plist ajouter:

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

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

Changer la barre d'état ne fonctionne pas en essayant de faire du push (contrôleurs de navigation), uniquement sur la présentation modale des contrôleurs de vue.

Doci
la source
8

Première étape, vous devez ajouter une ligne avec clé: View controller-based status bar appearanceet valeur NOau Info.plistfichier. Après cela, ajoutez 2 fonctions dans votre contrôleur pour que seul ce contrôleur affectera:

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

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

Swift 3

Dans Info.plist, ajoutez une ligne appelé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()

    }

}
vous êtes serveuse
la source
6

Il semble y avoir un petit problème concernant la couleur du texte de la barre d'état lors du traitement des barres de navigation.

Si vous voulez que l'entrée .plist Afficher l'apparence de la barre d'état basée sur le contrôleur soit définie sur YES, cela ne fonctionnera pas toujours lorsque 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 ont encore du mal, apparemment, il juge si la barre d'état doit être claire ou sombre par les 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 cela aide quelqu'un :)

nCr78
la source
6

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

Si vous utilisez a UINavigationController, le preferredStatusBarStylen'aura aucun effet sur le UIViewController.

Xcode 10 et Swift 4.

Définir une personnalisation UINavigationController

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
      }
  }
}
Tal Zion
la source
5

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 dans la méthode "didFinishLaunchingWithOptions":

application.statusBarStyle = .lightContent

Joemalski
la source
5

Swift 4+

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

navigationController.navigationBar.barStyle = .blackTranslucent
Alfi
la source
5

Voici les directives / instructions Apple concernant le changement de style de la barre d'état.

Si vous souhaitez définir le style de la barre d'état, le niveau d'application puis définissez UIViewControllerBasedStatusBarAppearanceà NOvotre .plistfichier. Et dans votre appdelegate> didFinishLaunchingWithOptionsajoutez suivant ine (vous pouvez le faire par programme à partir du délégué d'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 le UIViewControllerBasedStatusBarAppearancesur YESdans le .plistfichier, si vous devez définir le style de la barre d'état au niveau de UIViewController uniquement.
  2. Dans la fonction d'ajout de viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. override favoriteStatusBarStyle 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.

entrez la description de l'image ici

Krunal
la source
4

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

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
}
Karthickkck
la source
4

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
}
Satish Babariya
la source
'blackOpaque' n'est pas disponible: Utilisez UIStatusBarStyleLightContent
Makalele
3

Cela a fonctionné pour moi

Définissez l' View controller-based status barapparence sur NO dans plist puis In UIViewController viewDidAppearvient d'ajouter la ligne suivante

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Anshad Rasheed
la source
setStatusBarStyle est obsolète dans iOS 9.
Lastmboy
3

rapide 3

si Afficher l'apparence de la barre d'état basée sur le contrôleur = OUI 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 n'avez que UIViewController, utilisez le code ci-dessous:

    extension UIViewController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }
Datt Patel
la source
2
Ça ne marche pas pour moi. J'obtiens les erreurs "La propriété ne remplace aucune propriété de sa superclasse" et "Obtient pour 'FavoriteStatusBarStyle' avec le sélecteur d'Objective-C 'favoriteStatusBarStyle' est en conflit avec la déclaration précédente avec le même sélecteur d'Objective-C".
Theo
Merci pour cela, après 20 tentatives différentes et quelques combinaisons d'éléments à essayer, c'est le moyen de définir la couleur de la barre d'état. Je devais juste me souvenir d'appeler setNeedsStatusBarAppearanceUpdate () lorsque je voulais changer la couleur car j'ajoutais en mode nuit et le noir sur noir ne fonctionnait tout simplement pas.
Stuart P.
3

Swift 5

Pour ajouter plus de détails sur la réponse de PRAVEEN à https://stackoverflow.com/a/40066798/2082851 , je voudrais fournir mon implémentation. Il prend en charge la flexibilité de personnaliser la barre d'état de chaque contrôleur.

Dans l'ensemble, nous allons créer un BaseViewControllerqui gère la statusBarStylepropriété dans tous les cas. Lorsque vous créez un nouveau contrôleur, faites-en une sous-classe de ce contrôleur de base.

Chaque fois que vous souhaitez modifier l'apparence de l'état, il vous suffit de mettre à jour cette propriété. Le style de la barre d'état sera mis à jour immédiatement.

la mise en oeuvre

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

Démo

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

entrez la description de l'image ici

2. UINavigationController

Car UINavigationController, c'est un cas particulier, dont vous pouvez suivre l'une ou l'autre des solutions:

Solution A: Remplacer avec l'envoi de message

Étant donné que UINavigationController est un NSObjectet hérite de ObjectiveC, ses méthodes sont message dispatchet vous pouvez les remplacer.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Solution B: créer une UINavigationControllersous-classe

Si vous avez déjà une personnalisation UINavigationController(qui nécessite généralement de contrôler plus d'exigences), c'est la meilleure solution pour vous.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}
nahung89
la source
2

Vous pouvez utiliser une propriété booléenne nommée "shouldStatusBarDark" pour changer la couleur de la 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
         })
     }
 }
tiantong
la source
qu'est-ce que la propriété navView? merci d'avoir partagé votre solution
medskill
1
@medskill Le navView est juste une barre de navigation synoptique ajoutée par programme.
tiantong
2

La plupart de ces réponses sont la même chose qui est re-hachée, mais aucune d'elles ne s'adresse réellement à l'écran de lancement pour moi lorsque j'utilise un fond sombre.

J'ai contourné cela avec ce qui suit dans mon info.plistqui a produit une barre d'état de style léger.

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

Si vous recevez l'avertissement: Setter pour 'statusBarStyle' était obsolète dans iOS 9.0: Utilisez - [UIViewController favoriteStatusBarStyle] , puis pour définir la barre d'état sur clair ou foncé, 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 changer votre navBar, il indique uniquement le style et change donc la barre d'état en conséquence.

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

View controller-based status bar appearance to YES
Richard Hope
la source
2

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

viewController.modalPresentationCapturesStatusBarAppearance = true
RomanMisnikov
la source
1

Dans iOS 13, vous pouvez utiliser la .darkContent UIStatusBarStylepropriété pour afficher la barre d'état sombre

Hubert Fabisiak
la source
1

Si vous ne parvenez toujours pas à modifier la base de style de la barre d'état sur la méthode

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Vous pouvez essayer d'utiliser cette méthode:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
Jin
la source
0

Pour l'objectif C, ajoutez simplement cette ligne dans votre application Méthode didFinishLaunch

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Asfand Shabbir
la source
3
Ceci est obsolète depuis iOS 9
MK_Dev
0

en utilisant WebkitView

Swift 9.3 pour 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
    }

}
Homme oraculaire
la source
3
Swift 9.3? Mauvaise année, Marty
Unité iOS
Je recommande de ne pas utiliser l'API privée par exemple "statusBar". Apple modifie l'API à chaque fois! Et lorsque Apple change cette API, votre application peut planter et cela ne changera plus la barre d'état. Cela vous obligera à rechercher à nouveau une autre solution.
Doci