2013-02-22 18 views
6

現在、UIAppearanceプロキシを使用しているiOSアプリケーションのナビゲーションバーの背景画像をカスタマイズしています。通知をトリガする2つの異なるモードを切り替えるためのボタンがあります。この通知は、再度プロキシを使用して背景を別のイメージに変更します。私の問題は、この変更は別のコントローラに行って初めて表示されるようになったことです。私はコントローラー内のナビゲーションバーの更新を強制することができません。UIAppearanceを使用して変更したナビゲーションバーを更新する

私は私のMainTabBarControllerでこれを試してみた:

- (void) onAppChangedMode: (NSNotification*)notif { 

APP_MODE mode = (APP_MODE) [[notif object] integerValue]; 

// change navigation bar appearance 
[[UILabel appearance] setHighlightedTextColor:[UIColor redColor]]; 
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:(mode == 0 ? @"navbar.png" : @"navbar2.png")] forBarMetrics:UIBarMetricsDefault]; 
// trying to update 
for (UIViewController* vc in self.viewControllers) { 
    [vc.navigationController.navigationBar setNeedsDisplay]; 
} 

} 

何も...それは働いていません。どのようにそれを達成するためのアイデア?

ありがとうございます!

+2

を、私は理由を知りませんが、変更実行時にユーザーピアアンスになるまでの時間は、ロードされたビューには適用されません。ただし、ロードされたビュー自体に変更をすぐに適用することはできます。 – ilmiacs

+0

UIAppearanceを使用することはできませんが、各バーを個別に設定する必要があります。 – Claus

+0

いいえUIAppearanceは使用できますが、表示されるビューは影響を受けません。そのため、バーを明示的に設定する必要があります。 – ilmiacs

答えて

0

現在のナビゲーションバーのみの背景画像を変更するには、このコードを試してみてください。

[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 

UIAppearanceを変更した後に上記のコードを使用してください。これにより、現在のコントローラーのナビゲーションバーが強制的に変更されます。他のコントローラのナビゲーションバーは、UIAppearanceの変更によって処理されます。

+0

ここでのポイントはUIAppearance – Claus

+2

の私の回答を編集したものです。あなたのコードでUIAの見た目を変える際に上記のコードを一緒に使用してください。 –

7

私は同じ問題を抱えている、このコードがお手伝いします:

- (IBAction)btnTouched:(id)sender { 
    [[UADSwitch appearance]setOnTintColor:[UIColor redColor]]; 

    // Present a temp UIViewController 
    UIViewController *vc = [[UIViewController alloc]init]; 
    [self presentViewController:vc animated:NO completion:nil];//"self" is an instance of UIViewController 
    [vc dismissViewControllerAnimated:NO completion:nil]; 
} 
+1

+1あなたのメソッドを使用し、私の 'UITabBarController':警告:上にを表示しようとしましたが、ビューはウィンドウ階層にありません!だから私は、あなたの解決策を 'self'を' UIViewController * presentingController = [[[UIApplication sharedApplication] delegate]ウィンドウ]に置き換えて修正しました。 [presentingController presentViewController:viewController animated:YES completion:nil];、見つかりました[ここ](http://stackoverflow.com/a/13091131/2471006) - それは働いていました。タンク、時間がかかりました。 – anneblue

+0

iOS9の私のために働いていない –

10

ただ、窓からの景色を削除し、再び彼らを追加します。

for (UIWindow *window in [UIApplication sharedApplication].windows) { 
    for (UIView *view in window.subviews) { 
     [view removeFromSuperview]; 
     [window addSubview:view]; 
    } 
} 
+1

これは私のために完全に動作します。パフォーマンスに問題はなく、すぐに有効です。 – JamEngulfer

関連する問題