web-dev-qa-db-ja.com

UINavigationBarの外観を更新しますか?

IPadアプリには、アプリケーション設定ビューがあります。オプションの1つを使用すると、ユーザーはインターフェイスの配色を切り替えることができます。設定ビューは、セグエによって「メイン」アプリのウィンドウとは別のビューコントローラーに読み込まれます。

彼らが新しい色を選ぶとき、私はcolorSchemeColor変数を切り替えてこれを行います:

// set the colors and refresh the view
[[UINavigationBar appearance] setBarTintColor:colorSchemeColor];
[[UIToolbar appearance] setBarTintColor:colorSchemeColor];
[[UITabBar appearance] setBarTintColor:colorSchemeColor];

ただし、設定ビューを終了するまで、どのバーも色が変わりません。 (設定ウィンドウが消えると、「メイン」アプリの色が正しく変わります!)

そこで、設定ビューを更新した直後にこのコードを配置しようとしました。

[self.view setNeedsDisplay];
[self.view setNeedsLayout];

それは助けにはならなかった。だから私もこれを追加しました:

[self.navigationController.view setNeedsDisplay];
[self.navigationController.view setNeedsLayout];

これもうまくいきませんでした。

新しい色が選択されたときに設定ビューを「再描画」して、変更がすぐにわかるようにするにはどうすればよいですか?

本当にありがとう!

21
Kent

外観プロキシは、新しく初期化されたビューの外観にのみ影響します。アピアランスプロキシで色を設定しても、すでに表示されているナビゲーションバーには影響しません。

現在のビューを手動で更新する必要があります。例えば:

self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor;
35
Aaron Brager

Objective-C:

self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;

迅速:

self.navigationController?.isNavigationBarHidden = true
self.navigationController?.isNavigationBarHidden = false
19
zaolian

Aaron Bragerの答えは理想的なアプローチだと思いますが、私のアプリには約15の異なる外観設定が必要であり、分割ビューコントローラーを使用しているため、すべての設定をグローバル外観に再適用してから、表示されている2つのビューにすべて適用する必要があります。それは多くの冗長なコードです。

モーダルビューコントローラーを表示および非表示にすると、その下にあるすべてのものが強制的に再描画されるという考えに基づいて、これを試しましたが、完全に機能しました。

UIViewController *redrawTrigger = [[UIViewController alloc] init];
redrawTrigger.modalPresentationStyle = UIModalPresentationFullScreen;
[mySplitViewController presentModalViewController:redrawTrigger animated:FALSE];
[mySplitViewController dismissModalViewControllerAnimated:FALSE];
[redrawTrigger release];
9
arlomedia