web-dev-qa-db-fra.com

UIStatusBarStyle ne fonctionne pas dans Swift

J'essaie de changer la couleur de la barre d'état dans mon application Swift en blanc, mais je me heurte à un mur de briques. J'ai 3 ViewControllers qui sont chacun incorporés dans un NavigationController (cela pourrait-il être le problème? J'ai déjà essayé de placer le code dans la classe NavigationController.) J'ai essayé les deux morceaux de code suivants dans le didFinishLaunchingWithOptions de mon AppDelegate Fichier .Sift, mais ni a travaillé.

application.statusBarStyle = .LightContent

et

UIApplication.sharedApplication().statusBarStyle = .LightContent

Tout ce que les Docs ont à dire à ce sujet, c’est que UIBarButtonStyle est un Int et m’a donné cet extrait d’énumération qui ne m’a pas du tout aidé à l’implémentation.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

Qu'est-ce que je rate?

84
davidrayowens

Vous avez deux options.

Si vous souhaitez continuer à définir manuellement le style de la barre d'état, continuez à travailler, mais vous devrez ajouter la clé suivante à votre fichier info.plist avec la valeur NO.

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

Ou, si vous souhaitez continuer à utiliser l'apparence de la barre d'état basée sur le contrôleur de vue, au lieu de définir le statusBarStyle de l'application, remplacez la propriété preferredStatusBarStyle de chaque contrôleur de vue pour lequel vous souhaitez spécifier un style de barre d'état.

Swift

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

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

Swift 3.

dans AppDelegate.Swift didFinishLunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

dans AppDelegate.Swift didFinishLunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO
143
Maselko

Vous devez définir le:

navigationController.navigationBar.barStyle = .black

et le texte apparaîtra en blanc

31
Nico S.

Pour iOS9.x et Xcode7, insérez simplement ceci dans AppDelegate.Swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

Ceci transformera automatiquement le style de votre barre d'état en .Lightcontent Pour tous les contrôleurs de vue à l'intérieur d'un UINavigationController.

(En outre, supprimez View controller-based status bar appearance De Info.plist pour supprimer les avertissements que vous voyez probablement aussi!)

20
Biodave

Dans Swift 3, le style de la barre d'état a été remplacé par une propriété calculée dans UIViewController que vous pouvez remplacer comme ceci:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 
15
Eric Welander

Sur iOS 9, le texte suivant (setStatusBarStyle) est obsolète et vous recevrez un avertissement si vous suivez ce chemin.

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

Si vous voulez que tous les statusBars soient modifiés en une seule fois, essayez d’ajouter ce qui suit à votre Info.plist. Cela rendra également la barre d'état de votre écran de lancement blanche. Alors que le code ci-dessus ne sera pas.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
12
GuiSoySauce

pour moi tout ça ne marche pas avant que j'ajoute:

self.navigationController?.navigationBar.barStyle = .black;

alors:

  1. Définissez UIViewControllerBasedStatusBarAppearance sur YES dans .plist
  2. Dans viewDidLoad appelez self.setNeedsStatusBarAppearanceUpdate();
  3. Remplacer preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. Dans la méthode surchargée, je mets aussi le navigationBar.barStyle So final
    pour contenu léger :
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    et pour le contenu noir utilise par défaut

La source de ici et ici .

et si cela ne fonctionne pas, vous pouvez essayer d’ajouter un UINavigationControllerextension:

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }

        return .default
    }
}
9

Étrange, en utilisant Swift 3.1 & XC8.2.1, mais tout ce qui précède n'a pas fonctionné.

Ce que j'ai fait, c'est juste

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

Pas de Plist, pas d'autres trucs. HTH

5
Lord iPhonius

Dans Swift 3.0, vous pouvez remplacer un getter dans l'apparence de la barre d'état de ViewController for View:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}
2
Denis Kreshikhin

Étape 1. Ajoutez à info.plist View controller-based status bar appearance -> NO

Étape 2. Ajoutez le code dans la méthode où vous devez changer la couleur de la barre d'état:

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

Ligne de code clé: setNeedsStatusBarAppearanceUpdate()

1
Igor

Ne modifiez pas votre Info.plist. Ajoutez ceci à votre ViewController.Swift:

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