Swiftステータスバーの色/スタイルを変更する(preferredStatusBarStyleが無効な問題を書き換える)
4975 ワード
文書ディレクトリナビゲーションコントローラを使用する場合 .システムナビゲーションコントローラを使用する場合 .カスタムナビゲーションコントローラを使用する場合 .
デフォルトでは、上部ステータスバー(statusBar)はdefaultスタイル(黒い文字とアイコン)ですが、ステータスバーのサンプルを変更したい場合があります.これにより、アプリケーションがより調和しているように見えます.
私たちは異なる状況に対して、以下のような処理を行います.ナビゲーションコントローラを使用する場合 .システムナビゲーションコントローラを使用する場合 .カスタムナビゲーションコントローラを使用する場合 .
前提条件:plistファイルでViewcontroller-based status bar appearanceをYESに設定します(システムのデフォルトはYES、NOに誤設定しないでください).
ナビゲーションコントローラを使用していない場合
ナビゲーションコントローラUINavigationControllerを使用していない場合は、UIViewControllerでpreferredStatusBarStyle読み取り可能なプロパティを書き換え、特定のインプリメンテーションで使用するスタイルを返すだけです.その後、ステータスバースタイルを更新する必要がある場合は、setNeedsStatusBarAppearanceUpdate()メソッドを呼び出してトリガーします.
たとえば、システムのデフォルトのステータスバースタイルをlightContentに変更すると、コントローラのviewDidLoad()メソッドでトリガーできます.
システムナビゲーションコントローラを使用した場合
システムナビゲーションコントローラUINavigationControllerを使用すると、preferredStatusBarStyle読み取り可能なプロパティがUIViewControllerで書き換えられ、setNeedsStatusBarAppearance Update()メソッドがアクティブに呼び出されてもpreferredStatusBarStyleプロパティは呼び出されません.この場合、ステータスバーのスタイルはナビゲーションバーのスタイルに応じて自動的に変換されるからです.
ステータスバーのスタイルを変更するには、ナビゲーションバーのスタイルをアクティブに変更します.もちろん、この場合はpreferredStatusBarStyleプロパティを書き換える必要はありません.
例えば、ナビゲーションバーのスタイルを変更する.black、ナビゲーションバーの文字が白くなり、ステータスバーのスタイルが自動的に変わります.lightContent:
カスタムナビゲーションコントローラを使用した場合
カスタムナビゲーションコントローラを使用すると、上記の2つ目の場合のような準備をしても、ステータスバースタイルはナビゲーションバースタイルに従って変更できません.この場合、カスタムナビゲーションコントローラでchildForStatusBarStyle読み取り可能なプロパティを書き換え、topView Controlに戻ります.次のようになります.
ステータスバースタイルを変更するコントローラでは、preferredStatusBarStyleの読み取り可能なプロパティを書き換えるだけで、ステータスバースタイルの変更を実現できます.
この場合、ナビゲーションバーのスタイルを変更する必要はありません(navigationController?.navigationBar.barStyle=.blackと書く必要はありません)、setNeedsStatusBarAppearance Update()メソッドをアクティブに呼び出す必要はありません.カスタムC u s t o m N avigationControllerナビゲーションコントローラで書き換えられたchildForStatusBarStyleプロパティにtopViewControllerが返されたのは、スタックトップのコントローラ(topViewController)の中のpreferredStatusBarStyleプロパティ値を呼び出してステータスバースタイルを更新することをシステムに伝えるためです.
デフォルトでは、上部ステータスバー(statusBar)はdefaultスタイル(黒い文字とアイコン)ですが、ステータスバーのサンプルを変更したい場合があります.これにより、アプリケーションがより調和しているように見えます.
私たちは異なる状況に対して、以下のような処理を行います.
前提条件:plistファイルでViewcontroller-based status bar appearanceをYESに設定します(システムのデフォルトはYES、NOに誤設定しないでください).
ナビゲーションコントローラを使用していない場合
ナビゲーションコントローラUINavigationControllerを使用していない場合は、UIViewControllerでpreferredStatusBarStyle読み取り可能なプロパティを書き換え、特定のインプリメンテーションで使用するスタイルを返すだけです.その後、ステータスバースタイルを更新する必要がある場合は、setNeedsStatusBarAppearanceUpdate()メソッドを呼び出してトリガーします.
たとえば、システムのデフォルトのステータスバースタイルをlightContentに変更すると、コントローラのviewDidLoad()メソッドでトリガーできます.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override func viewDidLoad() {
super.viewDidLoad()
//
setNeedsStatusBarAppearanceUpdate()
}
システムナビゲーションコントローラを使用した場合
システムナビゲーションコントローラUINavigationControllerを使用すると、preferredStatusBarStyle読み取り可能なプロパティがUIViewControllerで書き換えられ、setNeedsStatusBarAppearance Update()メソッドがアクティブに呼び出されてもpreferredStatusBarStyleプロパティは呼び出されません.この場合、ステータスバーのスタイルはナビゲーションバーのスタイルに応じて自動的に変換されるからです.
ステータスバーのスタイルを変更するには、ナビゲーションバーのスタイルをアクティブに変更します.もちろん、この場合はpreferredStatusBarStyleプロパティを書き換える必要はありません.
例えば、ナビゲーションバーのスタイルを変更する.black、ナビゲーションバーの文字が白くなり、ステータスバーのスタイルが自動的に変わります.lightContent:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.barStyle = .black
}
カスタムナビゲーションコントローラを使用した場合
カスタムナビゲーションコントローラを使用すると、上記の2つ目の場合のような準備をしても、ステータスバースタイルはナビゲーションバースタイルに従って変更できません.この場合、カスタムナビゲーションコントローラでchildForStatusBarStyle読み取り可能なプロパティを書き換え、topView Controlに戻ります.次のようになります.
class CusstomNavigationController: UINavigationController {
override var childForStatusBarStyle: UIViewController? {
return topViewController
}
}
ステータスバースタイルを変更するコントローラでは、preferredStatusBarStyleの読み取り可能なプロパティを書き換えるだけで、ステータスバースタイルの変更を実現できます.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
この場合、ナビゲーションバーのスタイルを変更する必要はありません(navigationController?.navigationBar.barStyle=.blackと書く必要はありません)、setNeedsStatusBarAppearance Update()メソッドをアクティブに呼び出す必要はありません.カスタムC u s t o m N avigationControllerナビゲーションコントローラで書き換えられたchildForStatusBarStyleプロパティにtopViewControllerが返されたのは、スタックトップのコントローラ(topViewController)の中のpreferredStatusBarStyleプロパティ値を呼び出してステータスバースタイルを更新することをシステムに伝えるためです.