Dans un ViewController, que j'ai présenté de manière modale, j'ai fait ceci:
override func prefersStatusBarHidden() -> Bool {
return true
}
Cela fonctionnait, mais cela ne fonctionne plus. Quel est le meilleur moyen de masquer la barre d'état uniquement pour ce contrôleur de vue?
Pour Swift 3 & Swift 4, il a été remplacé par une variable telle que:
override var prefersStatusBarHidden: Bool {
return true
}
Si vous souhaitez "mettre à jour" l'état une fois que le contrôleur de vue est déjà affiché, vous devez appeler:
setNeedsStatusBarAppearanceUpdate()
Veuillez vous référer à documentation .
Pour Swift 3 et Swift 4.2 Lorsque la vue passe à Apparaître
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
quand la vue va disparaître
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.isStatusBarHidden = false
}
Il est possible que vous ayez besoin de définir dans votre info.plist, ligne suivante:
View controller-based status bar appearance = NO
Dans iOS 9, Xcode 7, Swift 2.0, vous retrouvez ce qu’il était auparavant.
override func prefersStatusBarHidden() -> Bool {
return true
}
En fait, Xcode vous dira que
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
est déconseillé et que vous devez utiliser la méthode prefersStatusBarHidden.
Dans votre UIViewController:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//It will show the status bar again after dismiss
UIApplication.shared.isStatusBarHidden = false
}
override var prefersStatusBarHidden: Bool {
return true
}
Pour Swift 3,
override var prefersStatusBarHidden: Bool{
return true
}
et ajoutez viewDidLoad()
self.modalPresentationCapturesStatusBarAppearance = true
Pour ceux qui luttent encore, le programme ci-dessous fonctionne pour iOS9.
Vous mettez à jour la fonction rootViewController prefersStatusBarHidden en l’appelant à partir de votre enfant ViewControllers enfant/petit-enfant. Cela fonctionne là où vous ajoutez childViewControllers directement à votre rootViewController.
Vous n'avez pas besoin de définir quoi que ce soit dans info.plist, mais le paramètre 'statusBarIsInitiallyHidden' fonctionne indépendamment de ce qui suit.
Tout d’abord, dans votre rootViewController, ajoutez ce qui suit:
-(void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStatusBarAppearance:) name:@"kStatusBarAppearance" object:nil];
}
-(void)updateStatusBarAppearance:(NSNotification *)n {
statusBarIsHidden = [n.object boolValue];
[self setNeedsStatusBarAppearanceUpdate];
}
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; //optional
}
-(BOOL)prefersStatusBarHidden{
return statusBarIsHidden;
}
Ensuite, dans le contrôleur de vue unique où vous souhaitez masquer la barre d'état, appelez ceci:
-(void)viewDidLoad {
[[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:true]];
}
-(void)popSelf {
[[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:false]];
}
Utilisez ce code:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
si ce code ne fonctionne pas, vous devez ajouter cette clé dans le fichier info.plist
Afficher l'apparence de la barre d'état basée sur le contrôleur - NON
Vous pouvez utiliser
override public func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
// hide status bar
dispatch_async(dispatch_get_main_queue(), {
if let window = UIApplication.sharedApplication().keyWindow {
window.windowLevel = UIWindowLevelStatusBar + 1
}
})
}
override public func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
// Show status bar
dispatch_async(dispatch_get_main_queue(), {
if let window = UIApplication.sharedApplication().keyWindow {
window.windowLevel = UIWindowLevelNormal
}
})
}
Aucune édition de .plist requise. Et l'AppStore va l'approuver
(UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false
Masquer la barre d'état en douceur en utilisant simplement UIAnimation et la propriété stockée.
Swift 3+
var statusBarState = false
override var prefersStatusBarHidden: Bool{
return statusBarState
}
Et puis dans viewWillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
statusBarState = true
UIView.animate(withDuration: 0.30) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
Une réponse tardive, mais si vous avez besoin d'une solution alternative, vous pouvez l'utiliser:
public func ShowStatusBar() {
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
UIView.animate(withDuration: 0.3) {
statusBarWindow?.alpha = 1
}
}
public func HideStatusBar() {
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
UIView.animate(withDuration: 0.3) {
statusBarWindow?.alpha = 0
}
}
J'utilise Xcode Version 9.2/Swift 3.2/iOS 11
J'ai reçu ce formulaire de réponse BADCloud bien que je ne sois pas sûr de savoir pourquoi cela n'a pas fonctionné pour lui.
Quoi qu'il en soit, cela a fonctionné pour moi pour un contrôleur de vue spécifique.
La différence entre cette réponse et les autres réponses ici est que, dans mon info.plist
quand j’avais initialement Afficher l’apparence de la barre d’état basée sur le contrôleur - NO avec les deux méthodes statusBar ci-dessous, cela ne fonctionnait pas mais quand j il est travaillé avec Oui avec les deux.
Dans la modification info.plist
: Afficher l’apparence de la barre d’état basée sur le contrôleur - YES
Dans le contrôleur de vue, vous voulez que cela change en ajoutant:
override func viewDidLoad() {
super.viewDidLoad()
// add this in ViewDidLoad
setNeedsStatusBarAppearanceUpdate()
}
// add this underneath ViewDidLoad
override var prefersStatusBarHidden: Bool {
return true
}
Solution complète pour iOS 11 et Swift 4, vous donnant le contrôle total de votre programme.
var statusBarHidden : Bool?
override var prefersStatusBarHidden: Bool {
get {
if let status = statusBarHidden { return status } else { return false }
}
set(status) {
statusBarHidden = status
setNeedsStatusBarAppearanceUpdate()
}
}
Maintenant, vous pouvez simplement afficher ou masquer la barre d'état en définissant la propriété à partir de votre code. Je l'ai testé comme ça:
@IBAction func Show(_ sender: Any) {
prefersStatusBarHidden = false
}
@IBAction func Hide(_ sender: Any) {
prefersStatusBarHidden = true
}
Fonctionne comme un charme.