私のナビゲーションバーにはwhite
backgroundColor
があり、ステータスバーにはdark
textColor
を使用しています。ユーザーがiOSテーマをダークモードに変更すると、ステータスバーがwhite
背景のwhite
テキストに変わります。その結果、何も見えません。アプリでこの変更を無効にするにはどうすればよいですか?
UINavigationController
はUIViewController
のサブクラスです(誰が????を知っていましたか)。
したがって、ナビゲーションコントローラーに埋め込まれたビューコントローラーを提示する場合、埋め込まれたビューコントローラーは実際には提示されません。あなたはナビゲーションコントローラーを提示しています! UINavigationController
は、UIViewController
のサブクラスとして、必要に応じて設定できるpreferredStatusBarStyle
およびchildForStatusBarStyle
を継承します。
次のいずれかの方法が機能するはずです。
info.plist
、次のプロパティを追加します:UIUserInterfaceStyle
(別名。「ユーザーインターフェイススタイル」)preferredStatusBarStyle
内のUINavigationController
をオーバーライドします
preferredStatusBarStyle
( doc )-ビューコントローラの優先ステータスバースタイルサブクラスまたは拡張UINavigationController
class MyNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
OR
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
childForStatusBarStyle
内のUINavigationController
をオーバーライドします
childForStatusBarStyle
( doc )-システムがステータスバーのスタイルを決定するためにビューコントローラーを使用する必要があるときに呼び出されます「コンテナービューコントローラーがその子ビューコントローラーの1つからステータスバースタイルを派生している場合、[このプロパティをオーバーライドして]その子ビューコントローラーを返します。nilを返すか、このメソッドをオーバーライドしない場合は、自分のステータスバースタイルが使用されます。このメソッドからの戻り値が変更された場合は、setNeedsStatusBarAppearanceUpdate()メソッドを呼び出します。
サブクラスまたは拡張UINavigationController
class MyNavigationController: UINavigationController {
override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
OR
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
上記の任意のビューコントローラを返すことができます。次のいずれかをお勧めします。
注:UINavigationController
をサブクラス化する場合は、IBのIDインスペクターを使用して、そのクラスをナビゲーションコントローラーに適用してください。
追伸私のコードはSwift 5.1構文を使用していますか????
アプリのUIViewControllerBasedStatusBarAppearance
キーをアプリのinfo.plist
にYES
に設定すると、現在表示されているビューコントローラーのステータスバースタイルをオーバーライドできます。
override var preferredStatusBarStyle: UIStatusBarStyle {
if #available(iOS 13, *) {
return .darkContent
} else {
return .default
}
}
そしてsetNeedsStatusBarAppearanceUpdate()メソッドを呼び出します
UIStatusBarStyle
への拡張を書くことができます:
extension UIStatusBarStyle {
static var black: UIStatusBarStyle {
if #available(iOS 13.0, *) {
return .darkContent
}
return .default
}
}
そして、ViewControllersで簡単に使用できます。
override var preferredStatusBarStyle: UIStatusBarStyle {
.black
}
ナビゲーションバーを常にlight
にしようとすることができます
if #available(iOS 13.0, *) {
navigationController?.navigationBar.overrideUserInterfaceStyle = .light
}
私はこのようなことをしました。
表示されているビューコントローラーに応じてステータスバーのスタイルを切り替えるトグラー機能があります
func toggleLight() {
self.navigationBar.barTintColor = AppColors.White
isDarkStyle = false
setNeedsStatusBarAppearanceUpdate()
}
そして、ここが最も重要な部分です
override var preferredStatusBarStyle: UIStatusBarStyle {
if #available(iOS 13.0, *) {
return isDarkStyle ? .lightContent : .darkContent
}
return isDarkStyle ? .lightContent : .default
}
IsDarkStyleは、ナビゲーションバーの背景色を暗くまたは明るく表します。暗い場合は、テキスト(コンテンツ)が明るいはずです。テキスト(コンテンツ)が明るい場合は、デフォルトまたはiOS 13から暗いものにする必要があります。
- 総括する: .lightContent, .darkContent
想定どおり、ダークモードとは無関係に表示されます。 .default
はダークモードの変更の影響を受けます!
この問題を解決するには2つの方法があります。 childViewControllerForStatusBarStyle関数をUINavigationControllerの下位クラスで定義します。
@interface MyNavigationController : UINavigationController
...
@end
@implementation MyNavigationController
...
- (UIViewController *)childViewControllerForStatusBarStyle
{
return self.topViewController;
}
...
@end
その後、コントローラーごとに関数preferredStatusBarStyleを追加する必要があります。
2番目のオプションは、すべてのコントローラーのpreferredStatusBarStyle関数を定義することです。ただし、この関数はルートコントローラーではなく、UINavigationControllerの下位クラスに配置する必要があります。
@interface MyNavigationController : UINavigationController
...
@end
@implementation MyNavigationController
...
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
...
@end
ただし、この場合でも、ナビゲーションバー(存在する場合)を非表示にするすべてのコントローラーの関数preferredStatusBarStyleを定義する必要があります。
この拡張機能は、ステータスバーのテキストの色を変更し、iOS 13もサポートするのに役立ちます https://stackoverflow.com/a/59767435/10512612
UINavigationController
を使用している場合は、このような拡張機能(または独自のサブクラス)のpreferredStatusBarStyle
をオーバーライドします(単にpreferredStatusBarStyle
をオーバーライドします)ビューコントローラは機能しません):
extension UINavigationController {
override open var preferredStatusBarStyle: UIStatusBarStyle {
guard #available(iOS 13, *) else {
return .default
}
return .darkContent
}
}
そしてフランクが言ったように、UIViewControllerBasedStatusBarAppearance
はinfo.plist
でYES
に設定する必要があります