モーダルビューからステータスバーを非表示にしてみてください。
すでにいくつかの方法を確認してください:
override func prefersStatusBarHidden() -> Bool {
return true
}
with / without self.setNeedsStatusBarAppearanceUpdate()
また
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Fade)
iOS 9では減価償却
これは全画面表示(モーダルセグエ表示オプション)で機能しますが、私の設定である全画面表示に注意してください。
何か考えがあれば….
non-fullscreen View Controllerのプレゼンテーションの場合、modalPresentationCapturesStatusBarAppearance
プロパティを使用する必要があります。
例えば.
toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .overFullScreen
toViewController.modalPresentationCapturesStatusBarAppearance = true
fromViewController.present(toViewController,
animated: true,
completion: nil)
fullscreen View Controllerのプレゼンテーションの場合、次のことを行う必要があります。
modalPresentationStyle
を設定します。prefersStatusBarHidden
を上書きするUIViewControllerBasedStatusBarAppearance
の値をYESに設定します例えば.
toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .fullScreen
fromViewController.present(toViewController,
animated: true,
completion: nil)
(はい、iOSのステータスバーの設定はひどく悪いです。StackOverflowがこのテーマについて非常に多くの質問と非常に多くのさまざまな答えを持っているのも不思議ではありません。)
全画面表示でモーダルを行うときにステータスバーを非表示にするには、viewDidLoadでこれを設定する必要があります。
override func viewDidLoad() {
super.viewDidLoad()
modalPresentationCapturesStatusBarAppearance = true
}
次に、標準の方法でステータスバーを非表示にします。
override var prefersStatusBarHidden: Bool {
return true
}
確かに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
}
ストーリーボードを使用していて、ステータスバーを表示/非表示にする場合は、前のビューコントローラーでこのメソッドを使用できます。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
UIApplication.shared.setStatusBarHidden(false, with: UIStatusBarAnimation.none)
}