最新のアップデート(Xcode 10+ / Swift 4.2+)
この記事は、過去数年間存在していたさまざまなアプローチの背後にある論理を理解したいと考えている人にはそのまま残されています。一方、Xcode 10以降、Swift 4.2の 最初のアプローチは非推奨になり、サポートされなくなりました(つまり、使用しようとしても効果がありません)。Plist.info
フラグの背後にある推論とカスタマイズの慣行をよりよく理解するために、情報が参照されています。
重要な説明
ステータスバーの外観をカスタマイズする2つの方法を理解することは非常に重要です。それらは異なり、混合してはなりません。
最初のアプローチ–アプリ全体で1色(iOS7以降非推奨)
info.plistで、次の名前のキーを見つけるか作成します
View controller-based status bar appearance
そして、それをNOに設定します。
それは何ですか?これは基本的に、アプリケーションでステータスバーの外観が各View Controllerによって個別に定義されないという設定を確立します。これは理解することが非常に重要です。つまり、アプリ全体、すべての画面で同じ設定になります。2つの設定があります。default
白の背景に黒のテキストである、またはlightContent
黒の背景に白のテキストであるです。
これらのいずれかを設定するには(すべての画面で1つの設定):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
これにより、各View Controllerでこの設定を再確立する必要がなくなります。ただし、いつでもこのメソッドを使用して、自発的に外観を変更できます。
2番目のアプローチ–各ビューコントローラーの個別の色
これは逆です。機能させるには、info.plistに移動して設定します
View controller-based status bar appearance
YES
このように、UIViewController
必要な各インスタンスにこの実装を挿入すると、新しいビューコントローラーが開いているときは常にステータスバーのスタイルが個別に設定されます。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
最初と同じですが、ステータスバーのスタイルをダークまたはライトのいずれかに設定し、ビューコントローラごとに個別に設定します。
このプロパティは、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")
}
}
}