J'ai suivi ce fil pour remplacer -preferredStatusBarStyle
, mais il n'est pas appelé. Y a-t-il des options que je peux changer pour l'activer? (J'utilise des XIB dans mon projet.)
ios
ios7
uikit
uistatusbar
trgoofi
la source
la source
Réponses:
Cause racine possible
J'ai eu le même problème et j'ai compris que cela se produisait parce que je ne configurais pas le contrôleur de vue racine dans ma fenêtre d'application.
Le
UIViewController
dans lequel j'avais implémenté le apreferredStatusBarStyle
été utilisé dans unUITabBarController
, qui contrôlait l'apparence des vues à l'écran.Lorsque j'ai défini le contrôleur de vue racine pour qu'il pointe vers cela
UITabBarController
, les modifications de la barre d'état ont commencé à fonctionner correctement, comme prévu (et lapreferredStatusBarStyle
méthode était appelée).Méthode alternative (obsolète dans iOS 9)
Alternativement, vous pouvez appeler l'une des méthodes suivantes, selon le cas, dans chacun de vos contrôleurs de vue, en fonction de sa couleur d'arrière-plan, au lieu d'avoir à utiliser
setNeedsStatusBarAppearanceUpdate
:ou
Notez que vous aurez également besoin de jeu
UIViewControllerBasedStatusBarAppearance
pourNO
dans le fichier plist si vous utilisez cette méthode.la source
setNeedsStatusBarAppearanceUpdate
- mes soupçons ont été confirmés lorsque j'ai apporté ce changement.Pour toute personne utilisant un UINavigationController:
Le
UINavigationController
ne transfère pas lespreferredStatusBarStyle
appels à ses contrôleurs de vue enfant. Au lieu de cela, il gère son propre état - comme il se doit, il dessine en haut de l'écran où se trouve la barre d'état et devrait donc en être responsable. Par conséquent, l'implémentationpreferredStatusBarStyle
dans vos VC au sein d'un contrôleur de navigation ne fera rien - ils ne seront jamais appelés.L'astuce consiste
UINavigationController
à savoir à quoi sert pour décider quoi retournerUIStatusBarStyleDefault
ouUIStatusBarStyleLightContent
. Il base cela sur sonUINavigationBar.barStyle
. La valeur par défaut (UIBarStyleDefault
) entraîne laUIStatusBarStyleDefault
barre d'état de premier plan sombre . EtUIBarStyleBlack
donnera uneUIStatusBarStyleLightContent
barre d'état.TL; DR:
Si vous voulez
UIStatusBarStyleLightContent
sur uneUINavigationController
utilisation:la source
preferredStatusBarStyle
sera en fait appelé sur le contrôleur de vue enfant si vous masquez la barre de navigation (définienavigationBarHidden
surYES
), exactement comme il convient.[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
navigationBarHidden
set toYES
aura effectivementpreferredStatusBarStyle
appelé, et un avertissement à ceux qui pourraient tomber dessus: cela fonctionne avecnavigationBarHidden
, mais pas avecnavigationBar.hidden
!J'ai donc ajouté une catégorie à UINavigationController mais j'ai utilisé les méthodes:
et que ceux-ci renvoient le UIViewController visible actuel. Cela permet au contrôleur de vue visible actuel de définir son propre style / visibilité préféré.
Voici un extrait de code complet pour cela:
Dans Swift:
Dans l'objectif-C:
Et pour faire bonne mesure, voici comment il est ensuite implémenté dans un UIViewController:
Dans Swift
Dans Objective-C
Enfin, assurez-vous que le plist de votre application n'a PAS "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur NON. Supprimez cette ligne ou définissez-la sur OUI (qui, je crois, est la valeur par défaut maintenant pour iOS 7?)
la source
return self.topViewController;
marche pour moi, maisreturn self.visibleViewController;
- passuper
cette méthode et vous voulez réellement changer le comportement de tous les contrôleurs de ce typePour tous ceux qui luttent toujours avec cela, cette simple extension dans swift devrait résoudre le problème pour vous.
la source
Mon application utilise trois:
UINavigationController
,UISplitViewController
,UITabBarController
, ceux - ci semblent tout ainsi prendre le contrôle de la barre d'état et causerontpreferedStatusBarStyle
de ne pas être appelé pour leurs enfants. Pour remplacer ce comportement, vous pouvez créer une extension comme le reste des réponses l'ont mentionné. Voici une extension pour les trois, dans Swift 4. J'aimerais qu'Apple soit plus clair sur ce genre de choses.Edit: mise à jour pour les modifications de l'API Swift 4.2
la source
La réponse de Tyson est correcte pour changer la couleur de la barre d'état en blanc dans
UINavigationController
.Si quelqu'un veut obtenir le même résultat en écrivant le code,
AppDelegate
utilisez le code ci-dessous et écrivez-le dans laAppDelegate's
didFinishLaunchingWithOptions
méthode.Et ne pas oublier de mettre l'
UIViewControllerBasedStatusBarAppearance
auYES
dans le fichier .plist, sinon le changement ne reflètent pas nécessairement.Code
la source
Sur un UINavigationController,
preferredStatusBarStyle
n'est pas appelé car iltopViewController
est préférable de le faireself
. Donc, pour êtrepreferredStatusBarStyle
appelé sur un UINavigationController, vous devez changer sonchildViewControllerForStatusBarStyle
.Recommandation
Remplacez votre UINavigationController dans votre classe:
Alternative non recommandée
Pour le faire pour tous les UINavigationController, vous pouvez remplacer une extension (avertissement: cela affecte UIDocumentPickerViewController, UIImagePickerController, etc.), mais vous ne devriez probablement pas le faire selon la documentation Swift :
la source
En plus de la réponse de Serenn, si vous présentez un contrôleur de vue avec un
modalPresentationStyle
(par exemple.overCurrentContext
), vous devez également appeler cela sur le contrôleur de vue nouvellement présenté:N'oubliez pas de remplacer également le
preferredStatusBarStyle
dans le contrôleur de vue présenté.la source
Un ajout à la réponse d'Hippo: si vous utilisez un UINavigationController, il est probablement préférable d'ajouter une catégorie:
Cette solution est probablement meilleure que de passer à un comportement bientôt obsolète.
la source
preferredStatusBarStyle
et fait la logique spécifique UINavigationController. À l'heure actuelle, cette logique est basée sur,navigationBar.barStyle
mais je peux voir des vérifications supplémentaires ajoutées (par exemple,UISearchDisplayController
passer au mode masquer la barre de navigation). En remplaçant la logique par défaut, vous perdez toutes ces fonctionnalités et vous laissez ouvert pour les moments gênants «wtf» à l'avenir. Voir ma réponse ci-dessus pour la bonne façon de le faire tout en prenant en charge le comportement du contrôleur de navigation intégré.Swift 4.2 et supérieur
Comme mentionné dans la réponse sélectionnée , la cause principale est de vérifier votre objet contrôleur de vue racine de fenêtre.
Cas possibles de votre structure de flux
Votre contrôleur de vue racine de fenêtre est un objet UIViewController et il ajoute ou supprime en outre le contrôleur de navigation ou tabController en fonction de votre flux d'application.
Ce type de flux est généralement utilisé si votre application a un flux de pré-connexion sur la pile de navigation sans onglets et un flux de connexion de post avec des onglets et éventuellement chaque onglet contient un contrôleur de navigation.
Il s'agit du flux dans lequel le contrôleur de vue racine de fenêtre est tabBarController, éventuellement chaque onglet contient en outre le contrôleur de navigation.
Il s'agit du flux dans lequel le contrôleur de vue racine de fenêtre est navigationController.
Je ne sais pas s'il est possible d'ajouter un contrôleur de barre d'onglets ou un nouveau contrôleur de navigation dans un contrôleur de navigation existant. Mais s'il y a un tel cas, nous devons passer le contrôle de style de la barre d'état au conteneur suivant. Donc, j'ai ajouté la même vérification dans l'extension UINavigationController pour trouver
childForStatusBarStyle
Utilisez les extensions suivantes, il gère tous les scénarios ci-dessus -
UIViewControllerBasedStatusBarAppearance
saisir la cléinfo.plist
car c'est vrai par défautPoints à considérer pour des flux plus complexes
Si vous présentez un nouveau flux de manière modale, il se détache du flux de style de barre d'état existant. Supposons donc que vous présentiez un
NewFlowUIViewController
, puis ajoutez un nouveau contrôleur de navigation ou tabBar àNewFlowUIViewController
, puis ajoutez l'extension deNewFlowUIViewController
ainsi pour gérer davantage le style de la barre d'état du contrôleur.Si vous définissez modalPresentationStyle autrement que
fullScreen
lors de la présentation modale, vous devez définirmodalPresentationCapturesStatusBarAppearance
true pour que le contrôleur de vue présenté reçoive le contrôle d'apparence de la barre d'état.la source
Solution (s) iOS 13
UINavigationController
est une sous-classe deUIViewController
(qui savait 🙃)!Par conséquent, lorsque vous présentez des contrôleurs de vue intégrés dans les contrôleurs de navigation, vous ne présentez pas vraiment les contrôleurs de vue intégrés; vous présentez les contrôleurs de navigation!
UINavigationController
, en tant que sous-classe deUIViewController
, hérite depreferredStatusBarStyle
etchildForStatusBarStyle
que vous pouvez définir à votre guise.L'une des méthodes suivantes devrait fonctionner:
info.plist
, ajoutez la propriété suivante:UIUserInterfaceStyle
(alias "Style d'interface utilisateur")Remplacer à l'
preferredStatusBarStyle
intérieurUINavigationController
preferredStatusBarStyle
( doc ) - Le style de barre d'état préféré pour le contrôleur de vueSous-classe ou extension
UINavigationController
OU
Remplacer à l'
childForStatusBarStyle
intérieurUINavigationController
childForStatusBarStyle
( doc ) - Appelé lorsque le système a besoin du contrôleur de vue à utiliser pour déterminer le style de la barre d'étatSous-classe ou extension
UINavigationController
OU
Vous pouvez retourner n'importe quel contrôleur de vue que vous souhaitez ci-dessus. Je recommande l'une des options suivantes:
topViewController
(ofUINavigationController
) ( doc ) - Le contrôleur de vue en haut de la pile de navigationvisibleViewController
(ofUINavigationController
) ( doc ) - Le contrôleur de vue associé à la vue actuellement visible dans l'interface de navigation (indice: cela peut inclure "un contrôleur de vue qui a été présenté de façon modale au-dessus du contrôleur de navigation lui-même")Remarque: Si vous décidez de sous
UINavigationController
- classe , n'oubliez pas d'appliquer cette classe à vos contrôleurs de navigation via l'inspecteur d'identité dans IB.PS Mon code utilise la syntaxe Swift 5.1 😎
la source
La réponse de @ serenn ci-dessus est toujours excellente pour le cas de UINavigationControllers. Cependant, pour swift 3, les fonctions childViewController ont été remplacées par
vars
. LeUINavigationController
code d'extension doit donc être:Et puis dans le contrôleur de vue qui devrait dicter le style de la barre d'état:
la source
Si votre viewController est sous UINavigationController.
Sous-classe UINavigationController et ajouter
ViewController
preferredStatusBarStyle
sera appelé.la source
UIStatusBarStyle dans iOS 7
La barre d'état dans iOS 7 est transparente, la vue derrière elle transparaît.
Le style de la barre d'état fait référence à l'apparence de son contenu. Dans iOS 7, le contenu de la barre d'état est sombre (
UIStatusBarStyleDefault
) ou clair (UIStatusBarStyleLightContent
). Les deuxUIStatusBarStyleBlackTranslucent
etUIStatusBarStyleBlackOpaque
sont déconseillés dans iOS 7.0. UtilisationUIStatusBarStyleLightContent
plutôt.Comment changer
UIStatusBarStyle
Si sous la barre d'état se trouve une barre de navigation, le style de la barre d'état sera ajusté pour correspondre au style de la barre de navigation (
UINavigationBar.barStyle
):Plus précisément, si le style de barre de navigation est UIBarStyleDefault, le style de barre d'état sera
UIStatusBarStyleDefault
; si le style de barre de navigation estUIBarStyleBlack
, le style de barre d'état seraUIStatusBarStyleLightContent
.S'il n'y a pas de barre de navigation sous la barre d'état, le style de la barre d'état peut être contrôlé et modifié par un contrôleur de vue individuel pendant l'exécution de l'application.
-
[UIViewController preferredStatusBarStyle]
est une nouvelle méthode ajoutée dans iOS 7. Il peut être remplacé pour renvoyer le style de barre d'état préféré:Si le style de la barre d'état doit être contrôlé par un contrôleur de vue enfant au lieu de soi, remplacez
-[UIViewController childViewControllerForStatusBarStyle]
pour renvoyer ce contrôleur de vue enfant.Si vous préférez désactiver ce comportement et définir le style de la barre d'état à l'aide de la
-[UIApplication statusBarStyle]
méthode, ajoutez laUIViewControllerBasedStatusBarAppearance
clé auInfo.plist
fichier d' une application et donnez-lui la valeur NO.la source
Si quelqu'un utilise un contrôleur de navigation et souhaite que tous ses contrôleurs de navigation aient le style noir, vous pouvez écrire une extension à UINavigationController comme celle-ci dans Swift 3 et elle s'appliquera à tous les contrôleurs de navigation (au lieu de l'assigner à un contrôleur à un temps).
la source
Dans Swift pour tout type de UIViewController:
Dans votre
AppDelegate
set:myRootController
peut être tout type deUIViewController
, par exempleUITabBarController
ouUINavigationController
.Ensuite, remplacez ce contrôleur racine comme ceci:
Cela changera l'apparence de la barre d'état dans l'ensemble de votre application, car le contrôleur racine est seul responsable de l'apparence de la barre d'état.
N'oubliez pas de définir la propriété
View controller-based status bar appearance
sur YES dans votreInfo.plist
pour que cela fonctionne (ce qui est la valeur par défaut).la source
Solution Swift 3 iOS 10:
la source
La plupart des réponses n'incluent pas une bonne implémentation de la
childViewControllerForStatusBarStyle
méthode pourUINavigationController
. Selon mon expérience, vous devez gérer des cas tels que lorsque le contrôleur de vue transparent est présenté sur le contrôleur de navigation. Dans ces cas, vous devez passer le contrôle à votre contrôleur modal (visibleViewController
), mais pas lorsqu'il disparaît.la source
Dans mon cas, j'ai accidentellement présenté le contrôleur View / Navigation comme
UIModalPresentationStyle.overFullScreen
, ce qui fait que je ne suispreferredStatusBarStyle
pas appelé. Après l'avoir réactivéUIModalPresentationStyle.fullScreen
, tout fonctionne.la source
Quant à iOS 13.4, la
preferredStatusBarStyle
méthode dans laUINavigationController
catégorie ne sera pas appelée, le swizzling semble être la seule option sans avoir besoin d'utiliser une sous-classe.Exemple:
En-tête de catégorie:
La mise en oeuvre:
Utilisation dans AppDelegate.h:
la source
Voici ma méthode pour résoudre ce problème.
Définissez un protocole appelé AGViewControllerAppearance .
AGViewControllerAppearance.h
Définissez une catégorie sur UIViewController appelée Upgrade .
UIViewController + Upgrade.h
UIViewController + Upgrade.m
Maintenant, il est temps de dire que votre contrôleur de vue implémente le protocole AGViewControllerAppearance .
Exemple:
Bien sûr, vous pouvez mettre en œuvre le reste des méthodes ( showsStatusBar , animatesStatusBarVisibility , prefferedStatusBarAnimation ) du protocole et UIViewController + Upgrade fera la personnalisation appropriée en fonction des valeurs fournies par eux.
la source
Si quelqu'un rencontre ce problème avec UISearchController. Créez simplement une nouvelle sous-classe de UISearchController, puis ajoutez le code ci-dessous dans cette classe:
la source
Notez que lorsque vous utilisez le
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
solutionassurez-vous d'aller dans votre liste et de régler "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur OUI. Si ce n'est pas le cas, cela ne fonctionnera pas.
la source
Depuis Xcode 11.4, remplacer le
preferredStatusBarStyle
propriété dans une extension UINavigationController ne fonctionne plus car elle ne sera pas appelée.Réglage du
barStyle
denavigationBar
à des.black
œuvres , certes , mais cela va ajouter des effets secondaires indésirables si vous ajoutez subviews à la navigationBar qui peut avoir différentes apparences pour le mode lumière et l' obscurité. Parce qu'en définissant lebarStyle
sur noir, lauserInterfaceStyle
vue qui est intégrée dans la barre de navigation aura alors toujoursuserInterfaceStyle.dark
indépendammentuserInterfaceStyle
de l'application.La bonne solution que je trouve est d'ajouter une sous-classe de
UINavigationController
et de la remplacerpreferredStatusBarStyle
. Si vous utilisez ensuite ce UINavigationController personnalisé pour toutes vos vues, vous serez du côté de la sauvegarde.la source
Le NavigationController ou TabBarController sont ceux qui doivent fournir le style. Voici comment j'ai résolu: https://stackoverflow.com/a/39072526/242769
la source