Dans mon application iPhone construit avec Xcode 5 pour voir iOS 7 I UIViewControllerBasedStatusBarAppearance=YES
dans info.plist
et dans mon ViewController
je ce code:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Mais la barre d'état est toujours noire sur fond noir.
Je sais que possible de changer cette application à l' échelle en mettant UIViewControllerBasedStatusBarAppearance=NO
en info.plist
, mais je dois en fait de modifier ce sur viewController
en viewController
base à l' exécution.
iphone
ios7
xcode5
uistatusbar
Andrew Smith
la source
la source
Réponses:
J'ai découvert que si votre ViewController se trouve à l'intérieur d'un navigationController, le navigationController
navigationBar.barStyle
détermine le statusBarStyle.Régler votre barre de navigation
barStyle
surUIBarStyleBlackTranslucent
donnera un texte de barre d'état blanc (c'est-à-direUIStatusBarStyleLightContent
), etUIBarStyleDefault
donnera un texte de barre d'état noir (c'est-à-direUIStatusBarStyleDefault
).Notez que cela s'applique même si vous changez totalement la couleur de navigationBar via son
barTintColor
.la source
UINavigationController
'spreferredStatusBarStyle
n'appelle pas par le biais du ViewController qu'il héberge, et retourne simplement en fonction de son navigationBarStyle.UIBarStyleBlackTranslucent
est obsolète, utilisez à laUIBarStyleBlack
placeOK, voici le truc. Vous devez ajouter la clé "Afficher la barre d'état basée sur le contrôleur" et définir la valeur sur Non.
Cela va à l'encontre de ce que semble être la signification de cette clé, mais même si vous définissez la valeur sur
No
, vous pouvez toujours modifier l'apparence de la barre d'état et savoir si elle s'affiche ou non dans n'importe quel contrôleur de vue. Il agit donc comme "Oui" mais réglez-le sur "Non"!Maintenant, je peux obtenir la barre d'état blanche ou sombre.
la source
Pour
preferredStatusBarStyle()
travailler dedansUINavigationController
etUITabBarController
j'ajoute le code suivant, qui obtiendra le style de barre d'état préféré du contrôleur de vue actuellement visible.Pour Swift 3, ce ne sont pas des méthodes mais des propriétés:
Les propriétés Swift 4.2 ont été renommées:
Usage
la source
J'arrive peut-être un peu tard, mais si quelqu'un d'autre cherche une solution fonctionnelle et vérifiée à l'échelle de l'application.
@mxcl a raison de décrire pourquoi cela se produit. Pour le corriger, nous créons simplement une extension (ou une catégorie dans obj-c) qui remplace la méthode favoriteSatusBarStyle () de UINavigationController. Voici un exemple dans Swift:
Ce code extrait simplement le premier contrôleur de vue (le contrôleur de vue racine) et le déballe (dans obj-c, vérifiez simplement qu'il n'est pas nul). Si le dépliage est réussi (pas nul), nous récupérons le rootViewControllers preferestatusBarStyle. Sinon, nous retournons simplement la valeur par défaut.
J'espère que cela aidera tous ceux qui pourraient en avoir besoin.
la source
return self.preferredStatusBarStyle()
rappellerait exactement la même méthode.visibleViewController
serait encore mieuxPour fournir plus de détails sur la réponse acceptée, placez la ligne suivante dans la
didFinishLaunchingWithOptions:
méthode de votre délégué d'application :Ensuite, dans votre Info.plist, ajoutez-le
View controller-based status bar appearance
et définissez-le surNO
.Je pense que c'est ainsi que cela devrait être fait, PAS à partir du contrôleur de navigation, si vous voulez la même couleur de barre d'état pour toute l'application. Vous pouvez avoir des écrans qui ne sont pas nécessairement intégrés dans une sous-classe
UINavigationController
ou une autreUINavigationController
sous-classe ailleurs, et d'autres choses.EDIT : Vous pouvez également le faire sans taper de code: https://stackoverflow.com/a/18732865/855680
la source
Dans viewDidLoad, écrivez simplement ceci
fais juste ça et ça marchera
pouvez-vous s'il vous plaît essayer ceci
Une autre chose que j'ai vue dans votre question est que vous avez écrit la méthode comme ceci
mais ça devrait être comme ça
la source
[self setNeedsStatusBarAppearanceUpdate];
une si bonne méthode, merci!Voici comment je l'ai résolu. Habituellement, le navigationController ou tabBarController sont ceux qui décident de l'apparence de la barre d'état (masqué, couleur, etc.).
J'ai donc fini par sous-classer le contrôleur de navigation et substituer preferStatusBarStyle. si le ViewContorller visible actuel implémente StatusBarStyleHandler, je demande que la valeur soit utilisée comme style, si ce n'est pas le cas, je renvoie simplement une valeur par défaut.
La façon dont vous déclenchez une mise à jour de l'apparence de la barre d'état consiste à appeler
setNeedsStatusBarAppearanceUpdate
qui déclenche àpreferredStatusBarStyle
nouveau et met à jour l'interface utilisateur en fonction de ce que la méthode renvoiePuis utilisation
la source
1) Un paramètre pour l'ensemble du projet:
Si disponible, supprimez la
UIViewControllerBasedStatusBarAppearance
paire clé-valeur de votre info.plist ou définissez-laNO
sans la supprimer. S'il n'est pas disponible dans votre info.plist, ne faites rien. La valeur par défaut estNO
pour cette propriété.Ajoutez le code ci-dessous à votre AppDelegate.m:
2) Différents paramètres pour différents contrôleurs de vue:
Ajoutez
UIViewControllerBasedStatusBarAppearance
une paire clé-valeur à votre info.plist et définissez-la surYES
.Si votre View Controller n'est pas intégré à Navigation Controller. Disons MyViewController. ajoutez simplement le code ci-dessous à votre fichier MyViewController.m. Si votre View Controller est intégré à Navigation Controller, créez une nouvelle classe Cocoa Touch et faites-en une sous-classe de UINavigationController. Disons MyNC. Sélectionnez la vue du contrôleur de navigation sur votre Storyboard, dans le volet droit; Utilitaires -> Inspecteur d'identité -> Classe personnalisée -> Classe, tapez "MyNC". Après avoir associé la vue Storyboard à votre Cocoa Touch Class "MyNC", ajoutez le code ci-dessous à votre MyNC.m:
la source
Même avec toutes les réponses ici, je n'ai toujours pas trouvé la solution exacte pour moi, mais j'ai commencé par la réponse de Daniel. Ce que j'ai fini avec c'était:
dans les contrôleurs de navigation (similaire pour tab, juste selectedViewController). Et puis il respectera le:
Dans chaque contrôleur de vue, sauf si vous le définissez autrement. Je n'ai pas besoin d'appeler
setNeedsStatusBarAppearanceUpdate()
n'importe où, il se met simplement à jour lorsque vous arrivez à chaque contrôleur de vue.la source
Solution (s) iOS 13
La réponse la plus votée utilise le code «hérité» 👎
La définition de la
barStyle
propriété est désormais (iOS 13+) considérée comme une «personnalisation héritée». Selon Apple ,Concernant votre tentative - Vous étiez sur la bonne voie!
UINavigationController
est une sous-classe deUIViewController
(qui savait 🙃)!Par conséquent, lorsque vous présentez les contrôleurs de vue intégrés aux 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 comme vous le souhaitez.L'une des méthodes suivantes devrait fonctionner:
Remplacer
preferredStatusBarStyle
dansUINavigationController
preferredStatusBarStyle
( doc ) - Le style de barre d'état préféré pour le contrôleur de vueSous-classe ou étendre
UINavigationController
OU
Remplacer
childForStatusBarStyle
dansUINavigationController
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 étendre
UINavigationController
OU
Vous pouvez retourner n'importe quel contrôleur de vue ci-dessus. Je recommande l'un des éléments suivants:
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 manière modale au-dessus du contrôleur de navigation lui-même")Remarque: si vous décidez de sous
UINavigationController
-classer, 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
.default
style prend en compte le mode sombre et il n'est pas documenté, donc si vous prenez également en charge les versions iOS précédentes, vous pouvez ajouterif #available(iOS 13, *) { return .darkContent } else { return .default }
si vous essayez de configurer le style de la barre d'état manuellement en fonction de la couleur derrière la barre d'état et cette couleur est "brillante".Si vous vouliez masquer le statusBar pendant splashScreen mais que vous vouliez changer le style en contenu clair (StatusBarInitiallyHidden sur Plist doit être NO pour masquer statusBar sur splash), vous pouvez l'ajouter à la méthode didFinishLaunchingWithOptions de appDelegate pour passer à lightContent.
la source
exemple rapide
dans AppDelegate.swift
dans info.plist set Afficher l'apparence de la barre d'état basée sur le contrôleur: NON
la source
Si vous utilisez
NavigationController
, vous pouvez sous-classeNavigationController
afin qu'elle consulte son contrôleur de vue enfant// MyCustomNavigationController
la source
Swift 4.2
la source
Vous pouvez définir le style de la barre d'état. Il ressemblera à la barre d'état comme IOS 6 et ci-dessous.
Collez ces méthodes dans votre contrôleur de vue
et appelez cette méthode depuis la vue s'est chargée comme ceci
la source
[self setStatusBarNeedsUpdate]
dans le deuxième bloc? (Ou autre chose au moins).Je veux juste ajouter une note pour un cas spécifique auquel j'ai été confronté. J'avais une autre UIWindow dans mon application pour afficher un visage de chat flottant partout dans mon application tout le temps. Cela n'a fait fonctionner aucune des solutions ci-dessus, et je ne sais pas vraiment pourquoi! Tout ce que j'ai remarqué, c'est que mon ViewController dans la nouvelle UIWindow en était la raison! Et si je voulais changer le style de la barre d'état, je dois le faire dans ce contrôleur de vue de la nouvelle UIWindow.
Cette note pourrait aider d'autres personnes qui ont une structure similaire! Donc, fondamentalement, vous pouvez appliquer les solutions mentionnées ci-dessus dans le ViewController de la nouvelle UIWindow.
Encore une fois, c'est un cas spécifique.
Merci
la source
Pour swift 3, dans votre UIViewController:
la source