最新のアップデート (Xcode 10+ / Swift 4.2+)
この記事は、過去数年間存在していたさまざまなアプローチの背後にあるロジックを理解しようとする人のためにそのまま残されています。一方、Xcode 10 の時点で、Swift 4.2 の最初のアプローチは廃止され、サポートされなくなりました (つまり、それを使用しようとしても効果がありません)。Plist.info
フラグとカスタマイズの実践の背後にある理由をよりよく理解するための情報として引き続き参照されます。
重要な説明
ステータス バーの外観をカスタマイズする 2 つの方法を理解することは非常に重要です。それらは異なるものであり、混在させるべきではありません。
最初のアプローチ – アプリ全体で 1 つの色 (iOS7 以降は非推奨)
info.plist で、というキーを見つけるか作成します
View controller-based status bar appearance
NOに設定します。
それは何をしますか?これは基本的に、アプリケーションで、ステータス バーの外観が各ビュー コントローラーによって個別に定義されていないことを示す設定を確立します。これを理解することは非常に重要です。これは、アプリ全体、すべての画面で設定が統一されていることを意味します。2 つの設定があります。default
白い背景に黒いテキストの 、またはlightContent
黒い背景に白いテキストの です。
これらのいずれかを設定するには (すべての画面で 1 つの設定):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
これにより、各ビュー コントローラーでこの設定を再確立する必要がなくなります。ただし、いつでもこの方法に頼って、自発的に外観を変更できます。
2 番目のアプローチ – 各ビュー コントローラーの個別の色
これは反対です。機能させるには、info.plist に移動して設定します
View controller-based status bar appearance
はいへ
UIViewController
このように、必要な各インスタンスにこの実装を挿入すると、新しいView Controllerが開かれるたびに、ステータスバーのスタイルが個別に設定されます。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
最初と同じように、ステータスバーの暗いスタイルまたは明るいスタイルを各View Controllerに個別に設定します。
このプロパティは、次の 2 つのシナリオで UIKit によって取得されます。
- 画面初期化時、UI準備時。
setNeedsStatusBarAppearanceUpdate()
コードを呼び出すと。
後者の場合、次のコードでステータスバーの外観を操作できます。
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
その後、 を呼び出すたびにtoggleAppearance()
、ステータスバー スタイルの変更がトリガーされます。
3 番目のアプローチ – ハック!
ステータスバーに直接アクセスできるハックがあります:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = UIColor.blue
}
return true
}
なぜハッキングするのですか?黒または白以外のステータス バーの色が必要な場合は、文書化されていない API を使用します。statusBar
KVC を使用してオブジェクトを取得し、その背景色を設定します。この方法で得られるオブジェクトはUIStatusBar
であり、これはから派生しUIView
ているため、プロパティを自然にサポートしbackgroundColor
ます。UINavigationBar
これは汚い方法であり、合法的な方法ではありませんが、これまでのところ、ステータスバーのカスタムカラーを設定する唯一の方法です ( navbar + statusbar の外観を完全にカスタマイズできるアプローチを考慮していません)。アプリが拒否される可能性があります。しかし、あなたは幸運かもしれません。もしそうなら、特定の複雑な状況 (入れ子になった子ナビゲーションやビュー コントローラーの階層など) では、これがほとんど唯一の方法かもしれません。
Xcode 10+、Swift 4.2
もう代替手段はありません。開発者は、フラグをYESに設定して(または、デフォルトで YES であるため、このアクションを省略して)、上記の手順に従って、各ビュー コントローラーにステータスバーの外観を定義させる必要があります。
ボーナス
任意の段階でステータスバーの外観を自発的に変更するために、複雑な状況で使用できるハックベースのソリューション (推奨されませんが)。色に関しては、次の拡張メソッドは、通常のアプローチで実行できることを正確に実行します。必要に応じて調整できます。
extension UIViewController {
func setStatusBarStyle(_ style: UIStatusBarStyle) {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
}
}
}