Como alterar a cor de fundo do UINavigationBar no AppDelegate

90

Eu sei como mudar a UINavigationBarimagem de fundo fazendo

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

e eu sei como definir a barra para cores diferentes dentro de cada Views... Agora eu quero mudar a cor de fundo sem usar uma imagem para uma cor sólida do app delegate. Não quero defini-lo cada vez a partir de cada visualização e não quero escrever um CGRect.

Eu tentei, [[UINavigationBar appearance] setBackgroundColor:[UIColor colorWithRed:33/255.0 green:34/255.0 blue:36/255.0 alpha:1.0]];mas não funcionou e não consigo encontrar um código que funcione no delegado do aplicativo.

Alguém poderia me indicar a direção certa?

Jonathan Thurft
fonte

Respostas:

202

Você pode usar [[UINavigationBar appearance] setTintColor:myColor];

Desde o iOS 7 você precisa configurar [[UINavigationBar appearance] setBarTintColor:myColor];e também [[UINavigationBar appearance] setTranslucent:NO].

[[UINavigationBar appearance] setBarTintColor:myColor];
[[UINavigationBar appearance] setTranslucent:NO];
Seb Thiebaud
fonte
Obrigado, você sabe como remover o gradiente padrão branco que vem de cima para torná-lo uma cor sólida?
Jonathan Thurft
1
Com tintColoro gradiente vai ficar. Se você não quiser ter este gradiente, você precisa criar uma subclasse de sua UINavigationBar OU para fazer uma UIImage para a aparência.
Seb Thiebaud
59
no iOS 7 que não funcionou, tive que usarnavigationBar.barTintColor = myColor;
Juan de la Torre
4
translucentpropriedade simplesmente não pode ser definida usando UIAppearance no iOS 6 e iOS 7. Portanto [[UINavigationBar appearance] setTranslucent:NO], o aplicativo travará com NSInvalidArgumentExceptionerro. Use [self.navigationController.navigationBar setTranslucent:NO]ou desmarque a transparência usando IB.
Sam
1
Versão Swift: UINavigationBar.appearance().barTintColor = myColor UINavigationBar.appearance().isTranslucent = false
fl034
103

Para alterar a cor de fundo e não a tonalidade, o seguinte trecho de código funcionará:

[self.navigationController.navigationBar setBarTintColor:[UIColor greenColor]];
[self.navigationController.navigationBar setTranslucent:NO];
LJ1
fonte
3
Esta deve ser a resposta aceita, funciona perfeitamente para iOS7.
joshuahornby10
Resposta correta para iOS 7. Trabalhando para mim.
LondonGuy
A translucidez é o requisito para fazer este trabalho. Como a resposta aceita não inclui isso, esta deve ser a resposta aceita.
Tristan Warner-Smith
3
Só para esclarecer, a resposta aceita é para AppDelegate e isso é para dentro do View Controller.
Reitor
@Dean está certo. A resposta aceita terá efeito para o recém-criado UIViewControllers, enquanto esta mostrará efeitos sempre que for chamada.
aramusss
18

Para fazer isso no iOS 7:

[[UINavigationBar appearance] setBarTintColor:myColor];
Lasse Bunk
fonte
15

Sintaxe Swift:

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

Acabei de colocar isso em AppDelegate didFinishLaunchingWithOptions e persiste em todo o aplicativo

Dustin Williams
fonte
8

Swift :

self.navigationController?.navigationBar.barTintColor = UIColor.red
self.navigationController?.navigationBar.isTranslucent = false
Hemang
fonte
6

Você pode fazer isso facilmente com o Xcode 6.3.1. Selecione sua NavigationBar no esboço do documento. Selecione o Inspetor de atributos. Desmarque Translúcido. Defina Bar Tint para a cor desejada. Feito!

ronm333
fonte
Obrigado, encontrei muitas referências sobre como fazer isso no ObjC e no swift, mas ninguém mencionou que está disponível no IB
Nick
3

Como as outras respostas mencionam, você pode usar setTintColor: , mas quer uma cor sólida e isso não é possível configurar a cor da tonalidade AFAIK.

A solução é criar uma imagem programaticamente e definir essa imagem como imagem de fundo para todas as barras de navegação via UIAppearance. Sobre o tamanho da imagem, não tenho certeza se uma imagem de 1x1 pixel funcionaria ou se você precisa do tamanho exato da barra de navegação. Verifique a segunda resposta desta pergunta para ver como criar a imagem.

Como conselho, não gosto de "sobrecarregar" o delegado do app com esse tipo de coisa. O que costumo fazer é criar uma classe nomeada AppearanceConfigurationcom apenas um método público configureAppearanceonde defino todas as coisas de UIAppearance que desejo e, em seguida, chamo esse método do delegado do aplicativo.

e1985
fonte
2

Você pode definir a cor de fundo do UINavigation usando este código em qualquer controlador de visualização

self.navigationController.navigationBar.backgroundColor = [UIColor colorWithRed:10.0f/255.0f green:30.0f/255.0f blue:200.0f/255.0f alpha:1.0f];
amar
fonte
2

Em Swift 4.2 e Xcode 10.1

Você pode alterar a cor da barra de navegação de seu AppDelegate diretamente para todo o seu projeto.

Na didFinishLaunchingWithOptions launchOptions:gravação abaixo para linhas de código

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

Aqui

tintColor serve para definir imagens de fundo, como o botão Voltar e imagens de linhas de menu, etc. (Veja abaixo a imagem do menu esquerdo e direito)

barTintColor é para a cor de fundo da barra de navegação

Se você deseja definir a cor da barra de navegação do controlador de visualização específica, escreva o código abaixo em 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

insira a descrição da imagem aqui

iOS
fonte
-1

O código de cores é o problema aqui. Em vez de usar 195/255, use 0.7647 ou 195.f / 255.f O problema é que a conversão do flutuador não está funcionando corretamente. Tente usar o valor flutuante exato.

ganka
fonte