J'utilise Xcode 8.0 beta 4.
Dans les versions précédentes, UIViewController avait une méthode pour définir le style de la barre d'état
public func preferredStatusBarStyle() -> UIStatusBarStyle
Cependant, j’ai trouvé que cela changeait en "Get ONLY varaiable" dans Swift 3.
public var preferredStatusBarStyle: UIStatusBarStyle { get }
Comment peut-on fournir le style à utiliser dans mon UIViewController?
Ceci est la méthode préférée pour iOS 7 et supérieur
Dans le Info.plist
de votre application, définissez "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur OUI.
Remplacez preferredStatusBarStyle
dans chacun de vos contrôleurs de vue . Par exemple:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Si preferredStatusBarStyle
renvoie un style de barre d'état préféré différent en fonction de quelque chose qui change dans votre contrôleur de vue (par exemple, si la position de défilement ou si une image affichée est sombre), vous voudrez alors appeler setNeedsStatusBarAppearanceUpdate()
lorsque cet état change.
Si vous utilisez un contrôleur de navigation et souhaitez utiliser le style de barre d'état préféré de chaque contrôleur de vue, voir https://stackoverflow.com/a/41026726/1589422 .
iOS avant la version 7, méthode obsolète
Apple a déconseillé cette option , elle sera donc supprimée à l'avenir. Utilisez la méthode ci-dessus pour ne pas avoir à la réécrire lors de la publication de la prochaine version d'iOS.
Si votre application prend en charge Dans le Info.plist
de votre application, définissez l'option "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur NO.
Dans appDelegate.Swift
, la fonction didFinishLaunchingWithOptions
, ajoutez:
UIApplication.shared.statusBarStyle = .lightContent
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}, il suffit donc de fournir un getter:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Si vous définissez ceci de manière conditionnelle, vous devrez appeler setNeedsStatusBarAppearanceUpdate()
pour qu'il anime le changement lorsque vous êtes prêt.
Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Pour moi, cette méthode ne fonctionne pas:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
quand j’avais l'habitude de regarder chaque contrôleur, mais cela a fonctionné:
Dans le fichier info.list, ajoutez la ligne: View controller-based status bar appearance
et définissez la valeur NO
Suivant dans appdelegate:
UIApplication.shared.statusBarStyle = .lightContent
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 méthode didFinishLaunchingWithOptions
avant de retourner.
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = UIColor.red
}
UIApplication.shared.statusBarStyle = .lightContent
changer backgroundColor
et statusBarStyle
selon les besoins.
Si vous souhaitez modifier la couleur de la statusBar
en blanc, pour toutes les vues contenues dans une UINavigationController
, ajoutez ceci à l'intérieur de AppDelegate
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
Ce code:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
not not work pour UIViewControllers
contenu dans une UINavigationController
, car le compilateur recherche la statusBarStyle
de la UINavigationController
et non la statusBarStyle
de la ViewControllers
qu'elle contient.
J'espère que cela aide ceux qui n'ont pas réussi avec la réponse acceptée!
Si vous souhaitez modifier le style de la barre d'état à tout moment après l'affichage 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 réglez-la surYES
var viewIsDark = Bool()
func makeViewDark() {
viewIsDark = true
setNeedsStatusBarAppearanceUpdate()
}
func makeViewLight() {
viewIsDark = false
setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
if viewIsDark {
return .lightContent
} else {
return .default
}
}
Vous pouvez également le faire dans le storyboard
Vous devrez le faire pour chaque contrôleur de navigation que vous avez. Cependant, toutes les vues sous ce contrôleur de navigation changeront le style/la couleur des barres d’état de la vue à celle que vous venez de sélectionner. Je trouve cette option mieux car vous pouvez voir vos résultats instantanément et vous ne devez pas ajouter de lignes de code supplémentaires dans chaque contrôleur de vue.
(Fait avec Xcode 8.3.3 dans un projet entièrement Swift)
La première étape consiste à ajouter une ligne avec la clé: View controller-based status bar appearance
et la valeur NO
au fichier Info.plist
. Après cela, ajoutez 2 fonctions dans votre contrôleur à seulement ce contrôleur aura les effets suivants:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = .lightContent
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = .default
}
Swift 3
Dans Info.plist, ajoutez une ligne intitulée "Afficher l'apparence de la barre d'état basée sur le contrôleur" et définissez sa valeur sur No
.
class YourViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarStyle = .lightContent //or .default
setNeedsStatusBarAppearanceUpdate()
}
}
Il semble y avoir un petit problème concernant la couleur du texte de la barre d’état lorsqu’il s’agit de barres de navigation.
Si vous voulez que l'apparence de la barre d'état basée sur le contrôleur Vue de l'entrée .plist soit définie sur YES
, cela ne fonctionnera parfois pas si vous avez une barre de navigation colorée.
Par exemple:
override func viewWillAppear(_ animated: Bool) {
let nav = self.navigationController?.navigationBar
nav?.barTintColor = .red
nav?.tintColor = .white
nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
setNeedsStatusBarAppearanceUpdate()
}
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 luttent encore, apparemment, le style de la barre d'état doit être clair ou sombre en fonction des 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 ça aide quelqu'un :)
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 à la méthode "didFinishLaunchingWithOptions":
application.statusBarStyle = .lightContent
Swift 4.0 Veuillez utiliser ce code dans "didFinishLaunchingWithOptions launchOptions:" Appdelegate class
UIApplication.shared.statusBarStyle = .lightContent
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){
statusBar.backgroundColor = UIColor.black
}
Voici Directives/Instructions Apple à propos du changement de style de la barre d’état.
Si vous souhaitez définir le style de la barre d'état, le niveau de l'application, définissez UIViewControllerBasedStatusBarAppearance
sur NO
dans votre fichier .plist
. Et dans votre appdelegate
> didFinishLaunchingWithOptions
, ajoutez le suivant (par programme, vous pouvez le faire à partir du délégué de l'application).
Objectif c
[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
Rapide
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent
return true
}
si vous souhaitez définir le style de la barre d'état, au niveau du contrôleur de vue, procédez comme suit:
UIViewControllerBasedStatusBarAppearance
sur YES
dans le fichier .plist
, si vous devez définir le style de la barre d'état au niveau UIViewController uniquement. Dans la fonction d'ajout viewDidLoad - setNeedsStatusBarAppearanceUpdate
écrasez preferredStatusBarStyle dans votre contrôleur de vue.
Objectif c
- (void)viewDidLoad
{
[super viewDidLoad];
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Rapide
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Définissez la valeur de .plist en fonction du niveau de configuration du style de la barre d'état.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Cela a fonctionné pour moi :) J'ai un contrôleur de navigation intégré dans mes contrôleurs de vue avec une barre de navigation masquée. Je voulais allumer la barre de statut sur certaines des applications de viewsin.
Swift 3
si l'apparence de la barre d'état basée sur le contrôleur View = YES dans Info.plist
puis utilisez cette extension pour tous les NavigationController
extension UINavigationController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
s'il n'y a pas d'UINavigationController et que vous ne disposez que d'UIViewController, utilisez le code ci-dessous:
extension UIViewController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Cela a fonctionné pour moi
Définissez l'apparence de View controller-based status bar
dansNOdans la pliste, puis dans Dans UIViewController
viewDidAppear
vient d'ajouter la ligne suivante
UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Pour les personnes souhaitant modifier la barre d'état de tous les contrôleurs de vue sous: iOS 11, la solution Swfit 4 est assez simple.
1) Info.plist ajouter:
Afficher l'apparence de la barre d'état basée sur le contrôleur -> NON
2) Côté gauche du projet de sélection XCode> Cibles > Sélectionnez votre projet> Sous Général> Infos de déploiement> Sélectionner un style de barre d'état: Léger
Si vous souhaitez modifier la barre d'état uniquement pour un contrôleur de vue , dans viewDidLoad, ajoutez:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Swift 4+
pour le texte de la barre d'état blanche:
navigationController.navigationBar.barStyle = .blackTranslucent
Vous pouvez utiliser une propriété bool nommée "shouldStatusBarDark" pour changer la couleur de votre 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.
var shouldStatusBarDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return shouldStatusBarDark ? .default : .lightContent
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offSetY = scrollView.contentOffset.y
if offSetY > 50 {
UIView.animate(withDuration: 0.4, animations: {
self.navView.alpha = 1
self.shouldStatusBarDark = true
})
} else {
UIView.animate(withDuration: 0.4, animations: {
self.navView.alpha = 0
self.shouldStatusBarDark = false
})
}
}
La plupart de ces réponses sont identiques, mais aucune d’entre elles n’adresse réellement l’écran de lancement lorsque j’utilise un arrière-plan sombre.
Je contournais cela avec ce qui suit dans mon info.plist
qui produisait une barre d'état de style clair.
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Si vous utilisez une présentation modale, vous devez définir:
viewController.modalPresentationCapturesStatusBarAppearance = true
Pour ajouter à la grande réponse de @Krunal https://stackoverflow.com/a/49552326/4697535
Si vous utilisez un UINavigationController
, le preferredStatusBarStyle
n'aura aucun effet sur le UIViewController
.
Xcode 10 et Swift 4.
Définir une UINavigationController
personnalisée
Exemple:
class LightNavigationController: UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Utilisez une extension pour une solution au niveau de l'application:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
guard let index = tabBarController?.selectedIndex else { return .default }
switch index {
case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
default: return .default // set dark for tab 3
}
}
}
Si vous souhaitez modifier la barre d'état dans toute l'application.
N'oubliez pas les modifications de info.plist
Exécutez votre projet et vérifiez-le.
Mon projet dans Swift 5 et Xcode 10.2
iOS 11.2
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .black
return true
}
S'il vous plaît ajoutez la ligne suivante dans votre info.plist alors vous seul pouvez y arriver
"Afficher l'apparence de la barre d'état basée sur le contrôleur = NON"
Et ajoutez l'extrait de code suivant dans votre code et consultez le résultat
UIApplication.shared.statusBarStyle = .lightContent
UIApplication.shared.statusBarStyle = .default
Pour Objective C, ajoutez simplement cette ligne à votre application. Méthode didFinishLaunch
UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Je devenais:
La variable de substitution doit être aussi accessible que son type englobant
Ce qui est corrigé en ajoutant public
comme:
override public var preferredStatusBarStyle: UIStatusBarStyle {
get {
return .lightContent
}
}
Sur Swift3 iOS10.
Si vous recevez l'avertissement: Le Setter pour 'statusBarStyle' était obsolète dans iOS 9.0: Utilisez - [UIViewController preferredStatusBarStyle] , puis définissez la barre d'état sur claire ou sombre, utilisez le code suivant:
//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent
//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default
Cela ne fera pas que votre barre de navigation change, elle indique simplement le style et change donc la barre d'état en conséquence.
NB Vous devez vous assurer que vous avez défini votre info.plist.
View controller-based status bar appearance to YES
en utilisant WebkitView
Swift 9.3 iOS 11.3
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
@IBOutlet weak var webView: WKWebView!
var hideStatusBar = true
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsStatusBarAppearanceUpdate()
let myURL = URL(string: "https://www.Apple.com/")
let myRequest = URLRequest(url: myURL!)
UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
webView.load(myRequest)
}
}
extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}