web-dev-qa-db-ja.com

iOS 13のダークモードがアプリのステータスバーのテキストの色を変更しないようにするにはどうすればよいですか?

私のナビゲーションバーにはwhitebackgroundColorがあり、ステータスバーにはdarktextColorを使用しています。ユーザーがiOSテーマをダークモードに変更すると、ステータスバーがwhite背景のwhiteテキストに変わります。その結果、何も見えません。アプリでこの変更を無効にするにはどうすればよいですか?

10
EvGeniy Ilyin

iOS 13ソリューション

UINavigationControllerUIViewControllerのサブクラスです(誰が????を知っていましたか)。

したがって、ナビゲーションコントローラーに埋め込まれたビューコントローラーを提示する場合、埋め込まれたビューコントローラーは実際には提示されません。あなたはナビゲーションコントローラーを提示しています! UINavigationControllerは、UIViewControllerのサブクラスとして、必要に応じて設定できるpreferredStatusBarStyleおよびchildForStatusBarStyleを継承します。

次のいずれかの方法が機能するはずです。

  1. ダークモードを完全に無効にする
    • あなたのinfo.plist、次のプロパティを追加します:
      • キー-UIUserInterfaceStyle(別名。「ユーザーインターフェイススタイル」)
      • 価値-光
  2. preferredStatusBarStyle内のUINavigationControllerをオーバーライドします

    • preferredStatusBarStyledoc )-ビューコントローラの優先ステータスバースタイル
    • サブクラスまたは拡張UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      

      OR

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      
  3. childForStatusBarStyle内のUINavigationControllerをオーバーライドします

    • childForStatusBarStyledoc )-システムがステータスバーのスタイルを決定するためにビューコントローラーを使用する必要があるときに呼び出されます
    • Appleのドキュメントによると、

      「コンテナービューコントローラーがその子ビューコントローラーの1つからステータスバースタイルを派生している場合、[このプロパティをオーバーライドして]その子ビューコントローラーを返します。nilを返すか、このメソッドをオーバーライドしない場合は、自分のステータスバースタイルが使用されます。このメソッドからの戻り値が変更された場合は、setNeedsStatusBarAppearanceUpdate()メソッドを呼び出します。

    • つまり、ここでソリューション3を実装しない場合、システムは上記のソリューション2にフォールバックします。
    • サブクラスまたは拡張UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      

      OR

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      
    • 上記の任意のビューコントローラを返すことができます。次のいずれかをお勧めします。

      • topViewController(of UINavigationController)( doc )-ナビゲーションスタックの最上部にあるビューコントローラー
      • visibleViewController(of UINavigationController)( doc )-ナビゲーションインターフェースで現在表示されているビューに関連付けられているビューコントローラー(ヒント:これには「ビューコントローラーナビゲーションコントローラー自体の上にモーダル表示されました」)

注:UINavigationControllerをサブクラス化する場合は、IBのIDインスペクターを使用して、そのクラスをナビゲーションコントローラーに適用してください。

追伸私のコードはSwift 5.1構文を使用していますか????

23
Andrew Kirna

アプリのUIViewControllerBasedStatusBarAppearanceキーをアプリのinfo.plistYESに設定すると、現在表示されているビューコントローラーのステータスバースタイルをオーバーライドできます。

override var preferredStatusBarStyle: UIStatusBarStyle {
    if #available(iOS 13, *) {
        return .darkContent
    } else {
        return .default
    }
}

そしてsetNeedsStatusBarAppearanceUpdate()メソッドを呼び出します

8
Frank Schlegel

UIStatusBarStyleへの拡張を書くことができます:

extension UIStatusBarStyle {
    static var black: UIStatusBarStyle {
        if #available(iOS 13.0, *) {
            return .darkContent
        }
        return .default
    }
}

そして、ViewControllersで簡単に使用できます。

override var preferredStatusBarStyle: UIStatusBarStyle {
    .black
}
4
buxik

ナビゲーションバーを常に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はダークモードの変更の影響を受けます!

0
Michał Ziobro

この問題を解決するには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を定義する必要があります。

0
Alexey Brilev

この拡張機能は、ステータスバーのテキストの色を変更し、iOS 13もサポートするのに役立ちます https://stackoverflow.com/a/59767435/10512612

0

UINavigationControllerを使用している場合は、このような拡張機能(または独自のサブクラス)のpreferredStatusBarStyleをオーバーライドします(単にpreferredStatusBarStyleをオーバーライドします)ビューコントローラは機能しません):

extension UINavigationController {
  override open var preferredStatusBarStyle: UIStatusBarStyle {
    guard #available(iOS 13, *) else {
      return .default
    }
    return .darkContent
  }
}

そしてフランクが言ったように、UIViewControllerBasedStatusBarAppearanceinfo.plistYESに設定する必要があります

0
Ricky Padilla