web-dev-qa-db-fra.com

barre d'état masquée dans la vue modale (sur la présentation en plein écran)

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 ..

10
raphael

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:

  1. définir la nouvelle variable modalPresentationStyle.
  2. remplacer prefersStatusBarHidden dans le nouveau VC
  3. définir la valeur UIViewControllerBasedStatusBarAppearance de votre pliste d'application sur OUI

par 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.)

42
Womble

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
}
1
Vadim Pavlov

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
}
1
bnussey

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)
}
0
kikettas