Swiftステータスバーの色/スタイルを変更する(preferredStatusBarStyleが無効な問題を書き換える)

4975 ワード

文書ディレクトリ
  • ナビゲーションコントローラを使用する場合
  • .
  • システムナビゲーションコントローラを使用する場合
  • .
  • カスタムナビゲーションコントローラを使用する場合
  • .
    デフォルトでは、上部ステータスバー(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プロパティ値を呼び出してステータスバースタイルを更新することをシステムに伝えるためです.