essayez de cacher la barre d'état à partir d'une vue modale.
vérifie déjà plusieurs méthodes:
override func prefersStatusBarHidden() -> Bool {
return true
}
with / without self.setNeedsStatusBarAppearanceUpdate()
également
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Fade)
mais déprécié sous iOS 9
cela fonctionne en présentation plein écran (option de présentation modale segue) mais notez en sur plein écran ce qui est mon réglage.
si vous avez une idée ..
Pour une présentation non-plein écran d'un contrôleur de vue, vous devez utiliser la propriété modalPresentationCapturesStatusBarAppearance
.
par exemple.
toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .overFullScreen
toViewController.modalPresentationCapturesStatusBarAppearance = true
fromViewController.present(toViewController,
animated: true,
completion: nil)
Pour une plein écran présentation d’un View Controller, vous devez:
modalPresentationStyle
.prefersStatusBarHidden
dans le nouveau VCUIViewControllerBasedStatusBarAppearance
de votre pliste d'application sur OUIpar exemple.
toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .fullScreen
fromViewController.present(toViewController,
animated: true,
completion: nil)
(Oui, le réglage de la barre d'état dans iOS est pitoyable. Il n'est donc pas surprenant que Stack Overflow comporte autant de questions sur le sujet et de réponses variées.)
En effet, pour la mise à jour de la barre d’état FullScreen
appelée automatiquement, mais pas pour OverFullScreen
.
De plus, dans mon cas, j’avais besoin de traiter le contrôleur de navigation en pile, de passer ModalViewController en tant qu’enfant:
extension UINavigationController {
public override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.visibleViewController
}
public override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.visibleViewController
}
}
À l'intérieur de ModalViewController nous mettons à jour manuellement la barre d'état, également pour la rendre lisse, nous devons le faire dans viewWillDisappear
, mais à ce stade visibleViewController
still ModalViewController , rien n'est laissé pour utiliser l'état interne bool statusBarHidden et le mettre à jour en conséquence
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.statusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.statusBarHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return self.statusBarHidden
}
Pour masquer la barre d'état lors de l'utilisation d'un mode modal en plein écran, vous devez définir ceci dans viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
modalPresentationCapturesStatusBarAppearance = true
}
Ensuite, utilisez la méthode standard pour masquer la barre d’état:
override var prefersStatusBarHidden: Bool {
return true
}
Si vous utilisez un storyboard et que vous souhaitez masquer/afficher la barre d'état, vous pouvez utiliser cette méthode sur le contrôleur de vue précédent:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
UIApplication.shared.setStatusBarHidden(false, with: UIStatusBarAnimation.none)
}