web-dev-qa-db-ja.com

iOS 13:UINavigationBarAppearanceを使用するとNavigationBar BarStyleが無視される

カスタムカラーのナビゲーションバーがあり、ステータスバーの色が白に設定されていることを確認する必要があります。 iOS 13より前のバージョンでは、これは簡単に実行できました。次のUIViewControllerからのコードスニペットは、うまく機能しました。

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.barStyle = .black
}

私がiOS 13で直面している問題は、NavigationBarのstandardAppearanceおよびscrollEdgeAppearanceを使用して、新しいUIKitで強制された背景の透明度を元に戻す必要があることです。 NavigationBarのテキストと背景色をUINavigationBarAppearance()で必要なものに取得できますが、ステータスバーの色が黒に戻ります。これは問題を再現する簡単な例です:

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.standardAppearance = UINavigationBarAppearance() // <--- This is the line that reverts my status bar colour back to black
    self.navigationController?.navigationBar.barStyle = .black
}

これが私が何か間違っているのか、これがUIKitのバグなのかわかりませんか?

[〜#〜]編集[〜#〜]

最後に、次の2つのプロパティをInfo.plistファイルに追加することで問題を解決することができました。

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

Info.plist properties

5
nonstopcoding

ようやく、アプリ全体のステータスバースタイルを白に設定することができました。 SOには多くの解決策がありますが、私の経験から、それらのいくつかは非常にiOS固有である可能性があります。つまり、iOS 8-12で誰かのために働いたものは、必ずしも機能することを意味しませんiOS 13withXCode 11.

これは、iOS 13XCode 11(またiOS 12を実行しているデバイスでテストされ、下位互換性が確保されています)およびUINavigationBar.appearance()。standardAppearance = UINavigationBarAppearance()。 Info.plistファイルで、次の2つのプロパティを追加します。

Info.plist properties

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
0
nonstopcoding

UIViewControllerBasedStatusBarAppearancefalseに設定せずにこれに対する解決策はありますか?ビューコントローラーごとにステータスバーの色を変更したいのですが。

1
Chamitha

私は難しい方法でそれを学びましたが、

UINavigationBarAppearanceのインスタンスを作成するだけでは十分ではありません。」実際にUINavigationBarインスタンスに設定する必要があります。

これは私が実際に言ったのではなく、フロー上のスタックのスレッドでこれを見つけましたが、探していましたがあなたのために見つけることができませんでした。ただし、状況に応じて以下を参考にしてください。

 //Using this we have to first set up the appearance.

 UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
 appearance.titleTextAttributes = @{NSFontAttributeName: font};

 //Then u have to use it on the navigation bar and if needed on scroll Edge 

  yourNavigationBar.standardAppearance = appearance;
  yourNavigationBar.scrollEdgeAppearance = appearance; 

 if you want this globally in your navigation bars 

 UINavigationBar.appearance.standardAppearance = appearance;

別の「ハック」は、Appdelegateにこれを追加することです。これは、アプリのすべてのナビゲーションバーで機能します。

Appdelgate

func configureGlobalUI() {

UINavigationBar.appearance().barTintColor = .red
}

didFinishLaunchingで呼び出す

0
Anjula S.