Jak zmienić kolor tła UINavigationBar z AppDelegate

91

Wiem, jak zmienić UINavigationBarobraz tła, robiąc

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nabbar"] forBarMetrics:UIBarMetricsDefault];

i wiem, jak ustawić pasek na różne kolory w każdym Views..... Teraz chcę zmienić kolor tła bez używania obrazu na jednolity kolor z app delegate. Nie chcę tego ustawiać za każdym razem z każdego widoku i nie chcę pisać CGRect.

Próbowałem, [[UINavigationBar appearance] setBackgroundColor:[UIColor colorWithRed:33/255.0 green:34/255.0 blue:36/255.0 alpha:1.0]];ale nie działa i nie mogę znaleźć kodu, który działałby w delegacie aplikacji.

Czy ktoś mógłby wskazać mi właściwy kierunek?

Jonathan Thurft
źródło

Odpowiedzi:

203

Możesz użyć [[UINavigationBar appearance] setTintColor:myColor];

Od iOS 7 musisz ustawić, [[UINavigationBar appearance] setBarTintColor:myColor];a także [[UINavigationBar appearance] setTranslucent:NO].

[[UINavigationBar appearance] setBarTintColor:myColor];
[[UINavigationBar appearance] setTranslucent:NO];
Seb Thiebaud
źródło
Dzięki, czy wiesz, jak usunąć biały domyślny gradient, który pochodzi z góry, aby uzyskać jednolity kolor?
Jonathan Thurft
1
Z tintColorgradientem pozostanie. Jeśli nie chcesz mieć tego gradientu, musisz utworzyć podklasę swojego UINavigationBar LUB utworzyć UIImage dla wyglądu.
Seb Thiebaud
59
na iOS 7, który nie działał, musiałem użyćnavigationBar.barTintColor = myColor;
Juan de la Torre
4
translucentwłaściwości po prostu nie można ustawić za pomocą UIAppearance w iOS 6 i iOS 7. W związku [[UINavigationBar appearance] setTranslucent:NO]z tym aplikacja ulegnie awarii z NSInvalidArgumentExceptionbłędem. Użyj [self.navigationController.navigationBar setTranslucent:NO]lub usuń zaznaczenie przezroczystości za pomocą IB.
Sam,
1
Wersja UINavigationBar.appearance().barTintColor = myColor UINavigationBar.appearance().isTranslucent = false
szybka
103

Aby zmienić kolor tła, a nie odcień, zadziała następujący fragment kodu:

[self.navigationController.navigationBar setBarTintColor:[UIColor greenColor]];
[self.navigationController.navigationBar setTranslucent:NO];
LJ1
źródło
3
To powinna być akceptowana odpowiedź, działa idealnie na iOS7.
joshuahornby 10
Prawidłowa odpowiedź dla iOS 7. Pracuje dla mnie.
LondonGuy,
Aby to zadziałało, wymagana jest przezroczystość. Ponieważ zaakceptowana odpowiedź tego nie zawiera, powinna to być odpowiedź zaakceptowana.
Tristan Warner-Smith
3
Dla wyjaśnienia, zaakceptowaną odpowiedzią jest AppDelegate, a to dotyczy kontrolera widoku.
Dziekan
@Dean ma rację. Zaakceptowana odpowiedź będzie obowiązywać dla nowo utworzonych UIViewControllers, podczas gdy ta będzie pokazywać efekty przy każdym wywołaniu.
aramusss
19

Aby to zrobić w iOS 7:

[[UINavigationBar appearance] setBarTintColor:myColor];
Lasse Bunk
źródło
15

Szybka składnia:

    UINavigationBar.appearance().barTintColor = UIColor.whiteColor() //changes the Bar Tint Color

Po prostu umieściłem to w AppDelegate didFinishLaunchingWithOptions i utrzymuje się to w całej aplikacji

Dustin Williams
źródło
8

Szybki :

self.navigationController?.navigationBar.barTintColor = UIColor.red
self.navigationController?.navigationBar.isTranslucent = false
Hemang
źródło
6

Możesz to łatwo zrobić za pomocą Xcode 6.3.1. Wybierz pasek nawigacji w konspekcie dokumentu. Wybierz Inspektor atrybutów. Odznacz opcję Translucent. Ustaw Bar Odcień na żądany kolor. Gotowe!

ronm333
źródło
Dzięki, znalazłem wiele odniesień do tego, jak to zrobić w ObjC i swift, ale nikt nie wspomniał o tym, że jest dostępny w IB
Nick
3

Jak wspominają inne odpowiedzi, możesz użyć setTintColor:, ale chcesz mieć jednolity kolor, a nie jest to możliwe do ustawienia koloru odcienia AFAIK.

Rozwiązaniem jest programowe utworzenie obrazu i ustawienie tego obrazu jako obrazu tła dla wszystkich pasków nawigacji za pośrednictwem UIAppearance. Jeśli chodzi o rozmiar obrazu, nie jestem pewien, czy obraz 1x1 piksel będzie działał, czy potrzebujesz dokładnego rozmiaru paska nawigacyjnego.Sprawdź drugą odpowiedź na to pytanie, aby zobaczyć, jak stworzyć obraz.

Radzę, że nie lubię "przeciążać" delegata aplikacji takimi rzeczami. Zwykle tworzę klasę o nazwie AppearanceConfigurationtylko z jedną publiczną metodą, w configureAppearancektórej ustawiam wszystkie potrzebne mi rzeczy UIAppearance, a następnie wywołuję tę metodę z delegata aplikacji.

e1985
źródło
2

Możesz ustawić kolor tła UINavigation za pomocą tego kodu w dowolnym kontrolerze widoku

self.navigationController.navigationBar.backgroundColor = [UIColor colorWithRed:10.0f/255.0f green:30.0f/255.0f blue:200.0f/255.0f alpha:1.0f];
amar
źródło
2

W Swift 4.2 i Xcode 10.1

Możesz zmienić kolor paska nawigacyjnego z AppDelegate bezpośrednio na cały projekt.

W didFinishLaunchingWithOptions launchOptions:zapisie poniżej do linii kodu

UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().barTintColor = UIColor(red: 2/255, green: 96/255, blue: 130/255, alpha: 1.0)

Tutaj

tintColor służy do ustawiania obrazów tła, takich jak przyciski Wstecz, obrazy linii menu itp. (Zobacz poniżej lewy i prawy obraz menu)

barTintColor służy do koloru tła paska nawigacji

Jeśli chcesz ustawić określony kolor paska nawigacji kontrolera widoku, napisz poniższy kod w viewDidLoad()

//Add navigation bar colour
navigationController?.navigationBar.barTintColor = UIColor(red: 2/255, green: 96/255, blue: 130/255, alpha: 1.0)
navigationController?.navigationBar.tintColor = UIColor.white

wprowadź opis obrazu tutaj

iOS
źródło
-1

Tutaj problemem jest kod koloru. Zamiast używać 195/255, użyj 0.7647 lub 195.f / 255.f Problem polega na tym, że konwersja wartości zmiennoprzecinkowej nie działa poprawnie. Spróbuj użyć dokładnej wartości zmiennoprzecinkowej.

ganka
źródło