2014-12-09 31 views
8

Próbuję ustawić inny kolor UINavigationBar dla różnych UIViewController w projekcie. Do teraz próbowałem podążać za kodem w metodzie ViewdidAppear każdej klasy UIViewController i jej nie działa nadal kolor paska nawigacji nie zmienia się.Jak ustawić różne kolory paska nawigacyjnego dla różnych kontrolerów UIViewcontrol w Xib?

UIImage *navBackgroundImage = [UIImage imageNamed:@"redbar.png"]; 
    [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 

Proszę mi pomóc

+0

Zmiana koloru paska nawigacyjnego w viewWillAppear. –

Odpowiedz

9

Spróbuj

[[UINavigationBar appearance] setBarTintColor: [UIColor redColor]]; 

Albo na iOS 6,

[[UINavigationBar appearance] setTintColor:[UIColor redColor]]; 

Jeśli masz kontroler nawigacji jako rootViewController, dostać go z:

UINavigationController* nc = (UINavigationController*)[[[UIApplication sharedApplication] delegate] window].rootViewController; 

a następnie ustawić kolor:

[nc.navigationBar setBarTintColor:[UIColor redColor]]; 

A jeśli chcesz zmienić kolor w każdym viewcontroller, wystarczy umieścić kod w każdym viewWillAppear metody

Jeśli nie chcesz zastąpić viewWillAppear w każdym kontrolerze viewcontroller, możesz stworzyć super viewcontroller dla twojego projektu. Ale jeśli jest zbyt późno, można również tworzyć niestandardowe UINavigationController i po prostu zastąpić metody Push/pop, takich jak:

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{ 
    [super pushViewController:viewController animated:animated]; 
    [self.navigationBar setBarTintColor:[UIColor redColor]]; 
} 

Zrób to dla czterech metod:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 
- (UIViewController *)popViewControllerAnimated:(BOOL)animated; 
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated; 

lub przynajmniej do metod, które posługiwać się. A następnie przesuń viewWillAppear w swoim widoku Kontrolery, które potrzebują innego koloru paska.

+0

nie działa, na mojej stronie domowej używam obrazu na uinavigationbar? Czy to jest powód? –

+0

czy istnieje sposób ustawienia domyślnego koloru paska nawigacyjnego, a następnie zmiany go tylko w kilku kontrolerach UIViewController? Próbowałem ustawić domyślną wartość niebieskiego w AppDelegate, następnie w jednym z moich kontrolerów ViewControllers ustawiłem kolor na czerwony. Problem polega na tym, że po powrocie pasek nawigacyjny pozostaje czerwony ... Chcę, aby powrócił do niebieski. Jakieś pomysły? – MattC

+0

Zaktualizowałem moją odpowiedź :) –

3

Wygląda na to, że chcesz ustawić kolor w scenorysie, a nie w kod.

enter image description here

a następnie otwórz przypisują skontrolować,

enter image description here

spróbować innego bar odcień lub zmienić jego powrotem obraz zadziała.

+0

mój błąd iwant todo to w Xib –

+0

Dzięki. To działało poprawnie. – fozoglu

0

Korzystanie z UINavigationController jako widoku głównego, trzeba użyć następującej metody od metody ViewWillAppear:

[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]]; 

To zmieni swój aktualny kolor UIViewController navigationbar :)

0
  1. Wdrożenie w kontroler podglądu, aby wyczyścić pasek nawigacyjny:

    -(void)viewdidload{ 
        [self.navigationController.navigationBar setBackgroundImage:[XXXImage imageWithColor:[UIColor clearColor]] forBarMetrics:UIBarMetricsDefault]; 
        ... 
    } 
    
  2. Ustaw niestandardowy widok w tej samej ramce paska nawigacyjnego.

4

Swift:

Globalny:

self.navigationController?.navigationBar.tintColor = UIColor.RGB(197, 104, 66) 

Dla każdego UIViewController:

override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     self.navigationController?.navigationBar.barTintColor = UIColor.RGB(197, 104, 66) 
} 
+0

Nie ma właściwości koloru RGB i nie można przekazać int –

+1

@lan Bell, jest to metoda dodana przeze mnie, ale nie boli za to pytanie:) –

+0

Dzięki! Ten kod działa dobrze dla mnie - ale ja poleciłbym przykład być czymś w stylu "self.navigationController? .navigationBar.barTintColor = .red" i nie używał osobiście metody niestandardowej. – woody121

0

Swift 2,2

func navigationCtrl(){ 


      self.navigationController?.navigationBar.barTintColor = UIColor.redColor() 

      self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "close_icon"), style: .Done, target: self ,action: #selector(UIViewController.dismissAction(_:))) 
      self.navigationItem.leftBarButtonItem?.tintColor = UIColor.whiteColor() 
      self.navigationController?.navigationBar.titleTextAttributes = [ NSFontAttributeName: UIFont.IRANSansWeb(UIFont.IRANSansWebType.Medium, size: 20) , NSForegroundColorAttributeName : UIColor.whiteColor()] 
     } 
+1

lepiej dodać pewne wyjaśnienie, w jaki sposób rozwiązałeś problem OP. –

0

Większość rozwiązań daje efekt mrugnięcia podczas zmiany koloru tła, gdy ustawiasz kolory na viewWillAppear.

Rozwiązaniem bez efektu mrugania jest ustawienie koloru paska nawigacyjnego dla każdego kontrolera widoku w viewDidLoad, a następnie zmiana koloru tła przed nawigacją, jak pokazano poniżej.

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.showGrayNavigationBar() 
} 

a następnie znaleźć poprzedniego kontrolera widoku i ustawić kolor tła przed viewAppears jak:

override func willMove(toParentViewController parent: UIViewController?) { 
    let count = self.navigationController?.viewControllers.count 
    let vc = self.navigationController?.viewControllers[count! - 2] 
    if vc is ServicesViewController{ 
     vc!.showGrayNavigationBar() 
    }else if vc is ServiceDetailsViewController{ 
     vc!.showBlueNavigationBar() 
    } 
}