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?
Réponses:
[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éfinissezView controller-based status bar appearance
surYES
.Remplacer
preferredStatusBarStyle
( documents Apple ) dans chacun de vos contrôleurs de vue. Par exemple:Si vous avez
preferredStatusBarStyle
renvoyé 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 appelersetNeedsStatusBarAppearanceUpdate()
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éfinissezView controller-based status bar appearance
surNO
.Dans
appDelegate.swift
, ladidFinishLaunchingWithOptions
fonction, ajoutez: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
àYES
vos applications de lainfo.plist
la source
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.info
drapeau 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:,
default
qui est du texte noir sur fond blanc, oulightContent
, qui est du texte blanc sur fond noir.Pour définir l'un de ces paramètres ( un paramètre pour tous les écrans ):
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
UIViewController
instance dont vous avez besoin: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:
setNeedsStatusBarAppearanceUpdate()
le code.Dans ce dernier cas, vous êtes autorisé à manipuler l'apparence de la barre d'état avec le code suivant:
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:
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
statusBar
objet en utilisant KVC et définissez sa couleur d'arrière-plan. L'objet que vous obtenez de cette façon estUIStatusBar
, qui est dérivé deUIView
et prend donc naturellement en charge labackgroundColor
proprié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'UINavigationBar
approche, 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.
la source
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:
Si vous définissez cela de manière conditionnelle, vous devrez appeler
setNeedsStatusBarAppearanceUpdate()
pour animer le changement lorsque vous serez prêtla source
prefersStatusBarHidden
pour certaines de vos vues. Si vous allez avec,UIApplication.shared.statusBarStyle
vous serez coincé avec.Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Pour moi, cette méthode ne fonctionne pas:
quand j'utilisais chaque contrôleur de vue, mais cela fonctionnait:
Dans le fichier info.list, ajoutez une ligne:
View controller-based status bar appearance
et définissez surNO
Suivant dans appdelegate:
la source
Si vous voulez changer la
statusBar
couleur de la en blanc, pour toutes les vues contenues dans aUINavigationController
, ajoutez ceci à l'intérieurAppDelegate
:Ce code:
ne fonctionne pas pour le
UIViewControllers
contenu dans aUINavigationController
, car le compilateur recherche lestatusBarStyle
deUINavigationController
, pas lestatusBarStyle
de leViewControllers
contenu par lui.J'espère que cela aidera ceux qui n'ont pas réussi avec la réponse acceptée!
la source
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
la source
If you call this method within an animation block, the changes are animated along with the rest of the animation block.
Xcode 10 ou version ultérieure
Testé dans Swift 5
Aucun code requis, suivez simplement les étapes ci-dessous.
N'oubliez pas les modifications apportées à info.plist
Exécutez votre projet et vérifiez-le.
Mon projet dans Swift 5 et Xcode 10.2 & 11.0
la source
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 surNO
Dans votre classe appdelegate, dans la
didFinishLaunchingWithOptions
méthode avant le retour.changement
backgroundColor
etstatusBarStyle
selon l'exigence.la source
Vous pouvez également le faire dans le storyboard
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.
(Fait avec Xcode 8.3.3 dans un projet tout Swift)
la source
View controller-based status bar appearance = NO
et 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.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:
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
2.2 )
Objective-C (ou réagir natif) changeant depuis App Delegate:
1) Info.plist ajouter:
2) AppDelegate -> didFinishLaunchingWithOptions
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.
la source
Première étape, vous devez ajouter une ligne avec clé:
View controller-based status bar appearance
et valeurNO
auInfo.plist
fichier. Après cela, ajoutez 2 fonctions dans votre contrôleur pour que seul ce contrôleur affectera:la source
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
.la source
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:
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 :)
la source
Pour ajouter à la grande réponse de @Krunal https://stackoverflow.com/a/49552326/4697535
Si vous utilisez a
UINavigationController
, lepreferredStatusBarStyle
n'aura aucun effet sur leUIViewController
.Xcode 10 et Swift 4.
Définir une personnalisation
UINavigationController
Exemple:
Utilisez une extension pour une solution au niveau de l'application:
la source
Xcode 8.3.1, Swift 3.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".
Ouvrez AppDelegate.swift et ajoutez ces lignes dans la méthode "didFinishLaunchingWithOptions":
application.statusBarStyle = .lightContent
la source
Swift 4+
pour le texte de la barre d'état blanche:
la source
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
àNO
votre.plist
fichier. Et dans votreappdelegate
>didFinishLaunchingWithOptions
ajoutez suivant ine (vous pouvez le faire par programme à partir du délégué d'application).Objectif c
Rapide
si vous souhaitez définir le style de la barre d'état, au niveau du contrôleur de vue, procédez comme suit:
UIViewControllerBasedStatusBarAppearance
surYES
dans le.plist
fichier, si vous devez définir le style de la barre d'état au niveau de UIViewController uniquement.Dans la fonction d'ajout de viewDidLoad -
setNeedsStatusBarAppearanceUpdate
override favoriteStatusBarStyle dans votre contrôleur de vue.
Objectif c
Rapide
Définissez la valeur de .plist en fonction du niveau de configuration du style de la barre d'état.
la source
Swift 4.0 Veuillez utiliser ce code dans la classe "didFinishLaunchingWithOptions launchOptions:" Appdelegate
la source
iOS 11.2
la source
Cela a fonctionné pour moi
Définissez l'
View controller-based status bar
apparence sur NO dans plist puis InUIViewController
viewDidAppear
vient d'ajouter la ligne suivantela source
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
s'il n'y a pas d'UINavigationController et que vous n'avez que UIViewController, utilisez le code ci-dessous:
la source
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
BaseViewController
qui gère lastatusBarStyle
proprié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
Démo
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
NSObject
et hérite deObjectiveC
, ses méthodes sontmessage dispatch
et vous pouvez les remplacer.Solution B: créer une
UINavigationController
sous-classeSi 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.la source
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.
la source
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.plist
qui a produit une barre d'état de style léger.la source
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:
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.
la source
Si vous utilisez la présentation modale, vous devez définir:
la source
Dans iOS 13, vous pouvez utiliser la
.darkContent
UIStatusBarStyle
propriété pour afficher la barre d'état sombrela source
Si vous ne parvenez toujours pas à modifier la base de style de la barre d'état sur la méthode
Vous pouvez essayer d'utiliser cette méthode:
la source
Pour l'objectif C, ajoutez simplement cette ligne dans votre application Méthode didFinishLaunch
la source
en utilisant WebkitView
Swift 9.3 pour iOS 11.3
la source