203 votes

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

J'utilise Xcode 8.0 beta 4.

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

public func preferredStatusBarStyle() -> UIStatusBarStyle

Cependant, j'ai constaté qu'il a été remplacé par un "Get ONLY varaiable" dans Swift 3.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Comment fournir le style à utiliser dans mon UIViewController ?

0 votes

Essayez ceci var preferredStatusBarStyle : UIStatusBarStyle = .lightContent

516voto

PRAVEEN Points 4476

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

Il s'agit de la méthode préférée pour iOS 7 et les versions ultérieures.

Dans le dossier de votre application Info.plist ensemble View controller-based status bar appearance à YES .

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

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Si vous avez preferredStatusBarStyle renvoyant un style de barre d'état préféré différent basé sur 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), alors vous voudrez appeler setNeedsStatusBarAppearanceUpdate() lorsque cet état change.

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

Apple a supprimé cette fonction afin qu'il soit supprimé à l'avenir. Utilisez la méthode ci-dessus pour ne pas avoir à le réécrire lors de la sortie de la prochaine version d'iOS.

Si votre demande supporte Dans le cadre de votre demande Info.plist ensemble View controller-based status bar appearance à NO .

Sur appDelegate.swift le didFinishLaunchingWithOptions fonction, ajouter :

UIApplication.shared.statusBarStyle = .lightContent

Pour le contrôleur de navigation

Si vous utilisez un contrôleur de navigation et que vous souhaitez que le style de barre d'état préféré de chaque contrôleur de vue soit utilisé et défini View controller-based status bar appearance à YES dans le dossier de votre application info.plist

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

0 votes

J'obtenais : > La surcharge de var doit être aussi accessible que le type qui l'englobe Ce qui est corrigé en ajoutant public comme : override public var preferredStatusBarStyle : UIStatusBarStyle { get { return .lightContent } } Sur Swift3 iOS10.

4 votes

Cela fonctionne pour moi. J'ai oublié d'insérer d'abord le nouveau paramètre dans Info.plist.

1 votes

@LightMan le uiapplication statusBarStyle n'est pas déprécié, je l'ai utilisé dans iOS 11 et cela fonctionne.

178voto

Hexfire Points 3180

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

Cet article est laissé intact pour toute personne désireuse de comprendre la logique derrière les différentes approches qui étaient présentes ces dernières années. En attendant, à partir de Xcode 10, Swift 4.2 première approche est déprécié et n'est plus pris en charge (c.-à-d. ne sera pas prendre effet si vous essayez de l'employer). Il est toujours référencé pour votre information afin de mieux comprendre le raisonnement derrière Plist.info le drapeau et la pratique de la personnalisation.

Précision importante

Il est très important de comprendre deux approches de la personnalisation de l'apparence de la barre d'état. Elles sont différentes et ne doivent pas être mélangées.

Première approche - une couleur pour toute l'application (DÉPRÉCIÉ depuis iOS7)

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

View controller-based status bar appearance

et le régler sur NON .

Ce qu'il fait ? Il établit essentiellement un paramètre qui dit que dans votre application, l'apparence de la barre d'état n'est pas défini individuellement par chaque contrôleur de vue . Il est très important de le comprendre. Cela signifie que vous disposez d'un paramètre uniforme pour l'ensemble de l'application. tous écrans. Il existe deux paramètres : default qui est un texte noir sur fond blanc, ou bien lightContent qui est un texte blanc sur fond noir.

Pour configurer l'un de ces éléments ( un seul réglage 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 le faire fonctionner, allez dans info.plist et mettez

View controller-based status bar appearance

à OUI

Ainsi, à 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 UIViewController l'instance dont vous avez besoin :

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

Vous avez la même chose que dans le premier cas, définir un 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. Lors de l'appel setNeedsStatusBarAppearanceUpdate() dans le code.

Dans ce dernier cas, vous pouvez manipuler l'apparence de la barre d'état en utilisant 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 existe 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 noire ou blanche, vous utilisez une API non documentée. Vous obtenez statusBar en utilisant KVC et en définissant sa couleur de fond. L'objet que vous obtenez de cette façon est UIStatusBar qui est dérivé de UIView et soutient donc naturellement backgroundColor propriété. C'est une méthode sale et non légale, mais jusqu'à présent, c'est la seule façon de définir une couleur personnalisée pour la barre d'état (sans tenir compte de l'option UINavigationBar qui permet de personnaliser entièrement l'apparence de la barre de navigation et de la barre d'état). Cela pourrait bien conduire votre application à être rejetée. Mais vous avez peut-être de la chance. Et si c'est le cas, dans certaines circonstances complexes (comme une hiérarchie de contrôleurs de navigation et de vue enfants imbriqués), cela peut être la seule façon, ou du moins la moins gênante, 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 doit laisser chaque le contrôleur d'affichage définit l'apparence de la barre d'état, en mettant l'indicateur à OUI (ou omettre cette action, car elle est OUI par défaut) et suivre les instructions ci-dessus.


Bonus

Une solution de type "hack" que vous pouvez (sans y être 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 l'approche normale. 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")
        }
    }
}

2 votes

Une fois que vous avez la barre d'état, vous pouvez également faire ceci : statusBar.setValue(UIColor.red, forKey : "foregroundColor") ; ou utiliser n'importe quelle clé existante pour définir n'importe quelle propriété qui est disponible pour UIStatusBar mais pas pour UIView.

0 votes

Application.statusBarStyle = .lightContent cette approche est généralement utilisée depuis iOS9 >La définition de 'statusBarStyle' est obsolète dans iOS 9.0 : utilisez -[UIViewController preferredStatusBarStyle] la solution à adopter est celle de UIViewController

0 votes

C'est le seul moyen de modifier le thème de couleurs de l'application. Cependant, il semble qu'une fois ce paramètre défini, vous devez toujours le réinitialiser lorsque vous changez de contrôleur de vue. La méthode preferredStatusBarStyle() est ignorée à partir de maintenant (même avec le paramètre approprié dans info.plist).

132voto

Abizern Points 52378

Vous pourriez 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 le définissez de manière conditionnelle, vous devrez appeler setNeedsStatusBarAppearanceUpdate() pour qu'il anime le changement quand vous êtes prêt.

2 votes

C'est une meilleure approche car vous pouvez choisir prefersStatusBarHidden pour certains de vos points de vue. Si vous optez pour UIApplication.shared.statusBarStyle vous serez coincé avec elle.

110voto

Gracu Points 947

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'ai utilisé chaque contrôleur de vue, mais ceci a fonctionné :

  • Dans le fichier info.list, ajouter la ligne : View controller-based status bar appearance et réglé sur NO

  • Suivant dans l'appdelegate :

    UIApplication.shared.statusBarStyle = .lightContent

0 votes

J'ai essayé seulement après avoir ajouté le code au délégué de l'application, mais la configuration d'info plist a été utile pour moi. Je vous remercie

6 votes

Le paramètre " statusBarStyle " a été supprimé dans iOS 9.0 : utilisez -[UIViewController preferredStatusBarStyle].

25voto

himanshu padia Points 1241

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

View controller-based status bar appearance avec une valeur booléenne fixée à NO

Dans votre classe appdelegate, dans didFinishLaunchingWithOptions 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 backgroundColor et statusBarStyle selon les besoins.

0 votes

Belle solution, mais est-ce que cela compte comme l'utilisation d'une API privée ?

0 votes

Fonctionne bien mais comment puis-je changer pour ma couleur personnalisée ?

0 votes

@MohanSrinivasan au lieu de "UIColor.red" vous pouvez spécifier votre couleur personnalisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X