IOS 13のViewControllerレベルごとにステータスバーのスタイルを変更したいのですが、これまでのところ、うまくいきませんでした。
info.plistでUIUserInterfaceStyle
をLight
として定義し(ダークモードをサポートしたくないため)、UIViewControllerBasedStatusBarAppearance
をtrue
に設定します。 preferredStatusBarStyle
はViewControllerで呼び出されますが、完全に無視されます。 UIUserInterfaceStyle
は常にVC設定をオーバーライドしているようです。iOS13でViewControllerごとのステータスバーのスタイルを機能させるにはどうすればよいですか?それともサポートされていませんか?
iOS 13.2、Swift 5.1
私にとって、前述の解決策からは何もうまくいきませんでした。 5時間後、私は modalPresentationCapturesStatusBarAppearance フラグで終了しました。
destinationNavigationController.modalPresentationCapturesStatusBarAppearance = true
sourceViewController.present(destinationNavigationController, animated: animated, completion: nil)
この後、preferredStatusBarStyle
がpresentedVCで呼び出されました。
override var preferredStatusBarStyle: UIStatusBarStyle {
if #available(iOS 13.0, *) {
if traitCollection.userInterfaceStyle == .light {
return .darkContent
} else {
return .lightContent
}
} else {
return .lightContent
}
}
IOS13では、UIStatusBarStyleに.darkContentオプションが追加されました。黒いテキストの場合、preferredStatusBarStyleに(.defaultの代わりに)これを使用します。
IOS13では同じ問題が発生しましたが、iOS12では問題ありませんでした。 3つのNavigationBarControllerを保持するTabBarControllerがあり、以前のViewControllerからのTabBarControllerを提示しています。プレゼンテーション時に.modalPresentationStyleを.fullScreenに設定することで修正しました。
tabbarController.modalPresentationStyle = .fullScreen
多分それは何らかの形であなたを助けるでしょう...
私の場合、UIStatusBarStyle
が正しくないという同様の問題がありました。アプリの一部のビューコントローラーでは、現在のシステムカラーモードを無視して、暗いステータスバースタイルを設定する必要があります。問題は私が使用した.default
値ですが、iOS 13ではコンテキストによって異なります。そのため、iOS 12およびiOS 13以降のケースを処理するための小さな回避策を追加しました。
private extension UIStatusBarStyle {
static var darkContentWorkaround: UIStatusBarStyle {
if #available(iOS 13.0, *) {
return .darkContent
} else {
return .default
}
}
}
ナビゲーションコントローラーを使用しているときにiOS 13で同じ問題が発生しました。ステータスバーの色を変更できました。
let navBarAppearance = UINavigationBarAppearance()
navigationBar.scrollEdgeAppearance = navBarAppearance
しかし問題は、現在のコントローラーを使用していたときにステータスバーが変更されなかったため、トップビューコントローラーでこのコードを使用しました
func viewDidAppear(_ animated:Bool){
if #available(iOS 13, *)
{
let statusBar = UIView(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame)!)
statusBar.backgroundColor = UIColor.systemBackground
UIApplication.shared.keyWindow?.addSubview(statusBar)
}
}
「UIColor.systemBackground」で自分の色を使用できます