UIStatusBarStyle PreferredStatusBarStyle ne fonctionne pas sur iOS 7
Dans mon iPhone application construite avec Xcode 5 pour iOS 7 j'ai mis UIViewControllerBasedStatusBarAppearance=YES
dans info.plist
, et dans mon ViewController
j'ai ce code:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Mais la barre de statut est toujours en noir sur le fond noir.
Je sais que c'est possible de changer cette application à l'échelle par la mise en UIViewControllerBasedStatusBarAppearance=NO
dans info.plist
, mais j'ai réellement besoin de modifier cela sur un viewController
par viewController
base au moment de l'exécution.
- Salut, j'ai le même problème, comme vous l'avez mentionné dans la question. Avez-vous la solution? Merci de me fournir cela.
- Vous pouvez avoir un regard sur: Modifier les applications de la barre d'état la couleur du texte
InformationsquelleAutor Andrew Smith | 2013-10-01
Vous devez vous connecter pour publier un commentaire.
J'ai découvert que si votre ViewController est à l'intérieur d'un navigationController puis le navigationController de
navigationBar.barStyle
détermine la statusBarStyle.Le réglage de votre navigationBar de
barStyle
àUIBarStyleBlackTranslucent
donnera blanc de la barre de statut du texte (ie.UIStatusBarStyleLightContent
), etUIBarStyleDefault
donnera noir barre d'état du texte (ie.UIStatusBarStyleDefault
).Note que cela s'applique même si vous changer totalement le navigationBar de la couleur par l'intermédiaire de son
barTintColor
.UINavigationController
’spreferredStatusBarStyle
ne pas faire appel par le biais de la ViewController il héberge, et, au lieu de juste les retours sur la base de ses navigationBarStyle.UIBarStyleBlackTranslucent
est obsolète, utilisezUIBarStyleBlack
au lieuUINavigationController
est un conteneur view controller, comme mentionné par @mxcl il utilise sondefault preferredStatusBarStyle
. Il y a unchildViewControllerForStatusBarStyle
qui est destinée à être remplacée par conteneur de-vue-contrôleur de fournir le point de vue contrôleur de gestion pour le statut privilégié de la barre de style. À mon avis, leUINavigationController
devrait fournir par défaut, le sommet le plus poussé-vue-contrôleur par défaut de mise en œuvre. De toute façon, vous pouvez avoir besoin de sous-classe (ou de l'utilisation d'une catégorie) de la valeur liquidative du contrôleur pour personnaliserchildViewControllerForStatusBarStyle
.OK, le truc est là. Vous ne devez ajouter la clé "- Vue-contrôleur basé sur la barre d'état" et affectez la valeur No.
Ceci est contraire à ce qu'il semble que le sens de cette clé est, mais même si vous définissez la valeur de
No
, vous pouvez toujours modifier l'apparence de la barre d'état, et si elle montre ou pas dans n'importe quelle vue contrôleur. Donc, il agit comme "Oui", mais est réglé à "Non"!Maintenant, je peux obtenir le statut de bar blanc ou noir.
Pour
preferredStatusBarStyle()
à travailler au sein deUINavigationController
etUITabBarController
- je ajouter le code suivant, qui obtiendra le statut privilégié de la barre de style à partir de la actuellement visible-vue-contrôleur.Pour Swift 3 ceux qui ne sont pas des méthodes, mais les propriétés:
La Swift 4.2 propriétés ont été renommés:
Utilisation
J'ai peut-être arrivé à ce un peu tard, mais au cas où quelqu'un d'autre est à la recherche d'un travail et vérifié application à l'échelle de la solution.
@mxcl est correct en décrivant pourquoi ce qui se passe. Pour la corriger, il suffit de créer une extension (ou de la catégorie en obj-c) qui remplace la preferredSatusBarStyle() la méthode de UINavigationController. Voici un exemple rapide:
Ce code simplement des extraits de la première-vue-contrôleur (la racine-vue-contrôleur) et déballe (en obj-c, juste vérifier qu'il n'est pas nul). Si l'unwrap est réussi (non nul) puis nous prenons la rootViewControllers preferredStatusBarStyle. Sinon nous il suffit de retourner la valeur par défaut.
Espère que cela aide quelqu'un qui en auraient besoin.
return self.preferredStatusBarStyle()
serait de retour d'appel dans la présente exactement la même méthode.De fournir plus de détails dans la accepté de répondre, mettre la ligne suivante dans votre application délégué
didFinishLaunchingWithOptions:
méthode:Puis, dans votre Info.plist, ajouter
View controller-based status bar appearance
et mis àNO
.Je crois que c'est comment il devrait être fait, non PAS de la manette de navigation, si vous voulez la même barre d'état la couleur pour l'ensemble de l'application. Vous pourriez avoir des écrans qui ne sont pas nécessairement intégrés dans un
UINavigationController
, ou d'un autreUINavigationController
sous-classe quelque part d'autre, et d'autres choses.MODIFIER: Vous pouvez aussi le faire sans avoir à taper le code: https://stackoverflow.com/a/18732865/855680
Dans le viewDidLoad viens d'écrire ce
viens de le faire et il va travailler
peut-u s'il vous plaît essayer cette
Une chose que j'ai vu dans votre question que
vous avez écrit la méthode comme ceci
mais il devrait en être ainsi
[self setNeedsStatusBarAppearanceUpdate];
telle une bonne méthode, je vous remercie!Voici comment je l'ai résolu. Habituellement, le navigationController ou tabBarController sont ceux de décider de l'apparence de la barre d'état (caché, couleur, etc).
J'ai donc fini par dérivation de la manette de navigation et dominante preferredStatusBarStyle. si le courant visible ViewContorller implémente StatusBarStyleHandler je demande pour la valeur à utiliser comme le style, si cela ne fonctionne pas je viens de renvoyer une valeur par défaut.
La façon dont vous déclencher une mise à jour de la barre d'état en apparence est en appelant
setNeedsStatusBarAppearanceUpdate
qui déclenchepreferredStatusBarStyle
de nouveau et les mises à jour de l'INTERFACE utilisateur en fonction de ce que la méthode renvoieL'utilisation
Même avec toutes les réponses ici, je n'ai toujours pas trouver la solution exacte pour moi, mais a commencé avec la réponse de Daniel. Ce que j'ai est:
dans les contrôleurs de la navigation (similaire pour l'onglet, il suffit de selectedViewController). Et puis il faudra respecter l':
Dans chaque vue-contrôleur, sauf si vous définissez c'est le contraire. Je n'ai pas besoin d'appeler
setNeedsStatusBarAppearanceUpdate()
n'importe où, on met juste à jour lorsque vous arrivez à chaque vue-contrôleur.1) Un paramètre pour l'ensemble du projet:
Si possible, supprimer
UIViewControllerBasedStatusBarAppearance
paire clé-valeur à partir de vos infos.plist, ou un ensembleNO
sans le supprimer. Si il n'est pas disponible dans votre info.plist, ne rien faire. Par défaut estNO
pour cette propriété.Ajouter le code ci-dessous à votre AppDelegate.m:
2) Différents réglages pour Afficher les Contrôleurs:
Ajouter
UIViewControllerBasedStatusBarAppearance
paire clé-valeur pour votre info.plist et le configurer pourYES
.Si votre Vue-Contrôleur n'est pas intégrer dans la Navigation Controller. Disons MyViewController. ajoutez simplement le code ci-dessous pour votre MyViewController.m de fichier. Si votre Vue-Contrôleur est intégrer dans la Navigation de Contrôleur, de créer une nouvelle Cacao Touche de Classe et de faire sous-classe de UINavigationController. Disons MyNC. Sélectionnez manette de Navigation sur votre Storyboard, au volet de droite; Utilitaires -> l'Identité de l'Inspecteur -> Classe Personnalisée -> Classe, de type "MyNC". Après la liaison d'Affichage Storyboard avec votre "MyNC" Cocoa Touch Catégorie, ajoutez le code ci-dessous pour votre MyNC.m:
Swift 4.2
Si au cas où vous vouliez cacher la barre d'état pendant le splashScreen mais je voulais changer de style, à la lumière de contenu (StatusBarInitiallyHidden sur Plist a PAS de cacher la barre d'état sur splash), vous pouvez ajouter ceci à appDelegate de didFinishLaunchingWithOptions méthode pour changer de lightContent.
swift exemple
dans AppDelegate.swift
en info.plist Vue d'ensemble du contrôleur d'état basé sur l'apparence de la barre: PAS de
Si vous utilisez
NavigationController
, vous pouvez sous-classeNavigationController
de sorte qu'il consulte son enfant-vue-contrôleur//MyCustomNavigationController
Vous pouvez définir l'état de la barre de style. Il ressemble à la barre d'état comme IOS 6 et ci-dessous.
Collez ces méthodes dans votre vue-contrôleur
et appelez cette méthode de vue, ne charge comme ce
[self setStatusBarNeedsUpdate]
dans le deuxième bloc? (Ou quelque chose d'autre au moins).Je veux juste ajouter une remarque d'un cas précis, j'ai fait face. J'ai eu un autre UIWindow dans mon application pour afficher une conversation en face à flotter sur mon app tout le temps. Faire cela a provoqué aucune des solutions ci-dessus ne fonctionne, et je ne suis pas vraiment sûr de savoir pourquoi! Tout ce que j'ai remarqué, c'est que mon ViewController dans le nouveau UIWindow en était la raison! Et si je voulais changer la barre d'état de style que j'ai à faire dans cette vue-contrôleur de la nouvelle UIWindow.
Cette remarque 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.
À nouveau cette un cas spécifique.
Grâce
Pour swift 3, dans votre UIViewController: