2013-02-22 14 views
6

Obecnie dostosowuję obraz tła paska nawigacji w aplikacji na iOS przy użyciu proxy UIAppearance. Jest przycisk do przełączania między dwoma różnymi trybami, który wyzwala powiadomienie. To powiadomienie zmieni tło dla innego obrazu, ponownie używając proxy. Mój problem polega na tym, że zmiana ta staje się widoczna tylko wtedy, gdy przechodzę do innego kontrolera i wracam do niego. Nie jestem w stanie wymusić aktualizacji paska nawigacji w kontrolerze.Aktualizowanie paska nawigacji po zmianie za pomocą UIAppearance

Próbowałem to w moim 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]; 
} 

} 

... ale nic nie działa. Każdy pomysł, jak to osiągnąć?

Dzięki!

+2

Nie wiem dlaczego, ale zmiany do uiappearance w czasie wykonywania nie będą miały zastosowania do załadowanych widoków. Możesz jednak natychmiast zastosować zmiany w załadowanych widokach. – ilmiacs

+0

to znaczy, że nie mogę używać UIAppearance, ale muszę ustawić każdy pasek osobno – Claus

+0

Nie. Możesz użyć UIAppearance, ale wyświetlane widoki nie zostaną zmienione. Więc ten pasek wyświetlany powinien być jawnie ustawiony. – ilmiacs

Odpowiedz

0

Spróbuj tego kodu, aby zmienić obraz tła dla obecnym pasku nawigacyjnym tylko:

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

Użyj powyższy kod po zmianie UIAppearance. Spowoduje to wymuszenie zmiany na pasku nawigacji bieżącego kontrolera. Paski nawigacji dla pozostałych kontrolerów będą obsługiwane przez zmianę UIAppearance.

+0

punktem tutaj jest użycie UIAppearance – Claus

+2

zredagowałem moje odpowiedzi. Użyj powyższego kodu RAZEM z kodem przy zmianie UIAppearance. –

7

Właśnie mam ten sam problem, kod ten pomoże Ci:

- (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 Użyłem twojej metody i otrzymałem ostrzeżenie/problem z moim 'UITabBarController':' Ostrzeżenie: Próba zaprezentowania na którego widok nie znajduje się w hierarchii okien! '. Więc zmodyfikowałem twoje rozwiązanie, zamieniając 'self' na' UIViewController * presentingController = [[[[[UIApplication sharedApplication] delegate] window] rootViewController]; [presentController presentViewController: viewController animated: YES completion: nil]; ', found [here] (http://stackoverflow.com/a/13091131/2471006) - i zadziałało. Czołgi, zabrały mi godziny. – anneblue

+0

Nie działa dla mnie na iOS9 –

10

Wystarczy usunąć widoki z okien i dodają jeszcze:

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

To działa idealnie dla mnie. Wygląda na to, że nie ma żadnych problemów z wydajnością i jest natychmiast skuteczny. – JamEngulfer

Powiązane problemy