web-dev-qa-db-ja.com

モーダルビューで非表示にされたステータスバー(フルスクリーンプレゼンテーション上)

モーダルビューからステータスバーを非表示にしてみてください。

すでにいくつかの方法を確認してください:

override func prefersStatusBarHidden() -> Bool {
    return true
}

with / without self.setNeedsStatusBarAppearanceUpdate()

また

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Fade)

iOS 9では減価償却

これは全画面表示(モーダルセグエ表示オプション)で機能しますが、私の設定である全画面表示に注意してください。

何か考えがあれば….

15
raphael

non-fullscreen View Controllerのプレゼンテーションの場合、modalPresentationCapturesStatusBarAppearanceプロパティを使用する必要があります。

例えば.

toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .overFullScreen
toViewController.modalPresentationCapturesStatusBarAppearance = true

fromViewController.present(toViewController,
            animated: true,
            completion: nil)

fullscreen View Controllerのプレゼンテーションの場合、次のことを行う必要があります。

  1. 新しいVCのmodalPresentationStyleを設定します。
  2. 新しいVCでprefersStatusBarHiddenを上書きする
  3. アプリのplist UIViewControllerBasedStatusBarAppearanceの値をYESに設定します

例えば.

toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .fullScreen

fromViewController.present(toViewController,
            animated: true,
            completion: nil)

(はい、iOSのステータスバーの設定はひどく悪いです。StackOverflowがこのテーマについて非常に多くの質問と非常に多くのさまざまな答えを持っているのも不思議ではありません。)

47
Womble

全画面表示でモーダルを行うときにステータスバーを非表示にするには、viewDidLoadでこれを設定する必要があります。

override func viewDidLoad() {
    super.viewDidLoad()    
    modalPresentationCapturesStatusBarAppearance = true
}

次に、標準の方法でステータスバーを非表示にします。

override var prefersStatusBarHidden: Bool {
    return true
}
2
bnussey

確かにFullScreenのステータスバーの更新は自動的に呼び出されますが、OverFullScreenの場合はそうではありません。

さらに、私の場合、ModalViewControllerを子として渡すために、スタック内のナビゲーションコントローラを処理する必要がありました。

extension UINavigationController {

    public override func childViewControllerForStatusBarHidden() -> UIViewController? {
        return self.visibleViewController
    }

    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return self.visibleViewController
    }
}

内部ModalViewControllerステータスバーを手動で更新します。これもスムーズにするために、viewWillDisappearで行う必要がありますが、その時点ではvisibleViewControllerはまだModalViewController、内部bool statusBarHiddenを使用し、それに応じて更新するために残されたものはありません

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

ストーリーボードを使用していて、ステータスバーを表示/非表示にする場合は、前のビューコントローラーでこのメソッドを使用できます。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      UIApplication.shared.setStatusBarHidden(false, with: UIStatusBarAnimation.none)
}
0
kikettas