iOS alterar a fonte e a cor do título da barra de navegação


101

Então, eu tenho este código que deve alterar a fonte do título da barra de navegação, mas não

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
                                                                       fontWithName:_dataManager.optionsSettings.fontString size:14], NSFontAttributeName,
                            [UIColor whiteColor], NSForegroundColorAttributeName, nil];

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

Alterar a fonte do botão Voltar com este código funciona perfeitamente.

   //set backbutton font
NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [UIFont fontWithName:_dataManager.optionsSettings.fontString size:15], NSFontAttributeName,
                                  nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes
                                            forState:UIControlStateNormal];

Respostas:


251

A maneira correta de alterar a fonte (e cor) do título é:

[self.navigationController.navigationBar setTitleTextAttributes:
 @{NSForegroundColorAttributeName:[UIColor redColor],
NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21]}];

Editar: Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: UIColor.red,
 NSAttributedString.Key.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Editar: Swift 4

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedStringKey.foregroundColor: UIColor.red,
 NSAttributedStringKey.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Swift 3:

self.navigationController?.navigationBar.titleTextAttributes = 
[NSForegroundColorAttributeName: UIColor.redColor(),
 NSFontAttributeName: UIFont(name: "mplus-1c-regular", size: 21)!]

2
O tamanho permanece o mesmo independentemente do valor que eu tentar
Raphael Royer-Rivard

1
Sim, percebi que minha fonte não foi carregada corretamente. Ainda não consigo descobrir o porquê, importei OpenSans-Light e OpenSans-Regular da mesma forma, apenas OpenSans-Light parece ser utilizável ...
Raphael Royer-Rivard

1
O código Obj-C está sem um colchete de fechamento. Deve ser: [self.navigationController.navigationBar setTitleTextAttributes: @ {NSForegroundColorAttributeName: [UIColor redColor], NSFontAttributeName: [UIFont fontWithName: @ "mplus-1c-regular" size: 21]}];
Dylan Hand

acesse o link para alterar a fonte backBarButton: stackoverflow.com/a/16538596/5967144
soorej babu

E ao usar uma NavBar LargeTitle? Não encontro nada navigationBar.LargeTitleTextAttributesnem nada a esse respeito. Você sabe como definir a fonte LargeTitle globalmente?
iKK

54

Não há nada de errado com as outras respostas. Estou apenas compartilhando a versão do storyboard para definir a fonte.

1. Selecione sua barra de navegação no seu controlador de navegação

navbar

2. Altere a fonte do título no Inspetor de atributos

fonte do título

(Você provavelmente precisará alternar a tonalidade da barra para a barra de navegação antes que o Xcode escolha a nova fonte)

Notas (advertências)

Verificado que isso funciona no Xcode 7.1.1+. ( Veja os exemplos abaixo )

  1. Você precisa alternar a tonalidade da barra de navegação antes que a fonte entre em vigor (parece um bug no Xcode; você pode voltar ao padrão e a fonte manterá)
  2. Se você escolher uma fonte do sistema ~ Certifique-se de que o tamanho não seja 0,0 (caso contrário, a nova fonte será ignorada)

Tamanho

  1. Parece que isso funciona sem problemas quando apenas uma NavBar está na hierarquia de visualização. Parece que NavBars secundárias na mesma pilha são ignoradas. (Observe que se você mostrar a navBar do controlador de navegação mestre, todas as outras configurações personalizadas da navBar serão ignoradas).

Gotchas (deux)

Alguns deles são repetidos, o que significa que muito provavelmente vale a pena notar.

  1. Às vezes, o xml do storyboard fica corrompido. Isso requer que você reveja a estrutura no Storyboard como modo de Código-fonte (clique com o botão direito do mouse no arquivo do storyboard> Abrir como ...)
  2. Em alguns casos, a tag navigationItem associada ao atributo runtime definido pelo usuário foi definida como um filho xml da tag view em vez da tag do controlador da view. Se assim for, remova-o de entre as tags para uma operação adequada.
  3. Alterne a tonalidade da NavBar para garantir que a fonte personalizada seja usada.
  4. Verifique o parâmetro de tamanho da fonte, a menos que use um estilo de fonte dinâmico
  5. A hierarquia de visualização substituirá as configurações. Parece que uma fonte por pilha é possível.

Resultado

navbar-italic

Amostras

Tratamento de fontes personalizadas

Observação ~ Uma boa lista de verificação pode ser encontrada no site Code With Chris e você pode ver o exemplo de projeto de download.

Se você tem sua própria fonte e deseja usá-la em seu storyboard, há um conjunto decente de respostas na seguinte pergunta do SO . Uma resposta identifica essas etapas.

  1. Obtenha seu arquivo de fonte personalizada (.ttf, .ttc)
  2. Importe os arquivos de fonte para o seu projeto Xcode
  3. No app-info.plist, adicione uma chave chamada Fonts fornecida pelo aplicativo. É um tipo de array, adicione todos os seus nomes de arquivo de fonte ao array, nota: incluindo a extensão do arquivo.
  4. No storyboard, na NavigationBar vá para o Attribute Inspector, clique com o botão direito do ícone da área de seleção de fonte. No painel pop-up, escolha Font to Custom e escolha o nome da família da fonte incorporada.

Solução alternativa de fonte personalizada

Portanto, o Xcode naturalmente parece que pode lidar com fontes personalizadas no UINavigationItem, mas esse recurso não está sendo atualizado corretamente (a fonte selecionada é ignorada).

UINavigationItem

Para contornar isso:

Uma maneira é corrigir o uso do storyboard e adicionar uma linha de código: Primeiro adicione um UIView (UIButton, UILabel ou alguma outra subclasse UIView) ao Controlador de Visualização (Não ao Item de Navegação ... O Xcode não está permitindo atualmente aquele). Depois de adicionar o controle, você pode modificar a fonte no storyboard e adicionar uma referência como uma saída para o seu View Controller. Basta atribuir essa visualização ao UINavigationItem.titleView. Você também pode definir o nome do texto no código, se necessário. Bug relatado (23600285).

@IBOutlet var customFontTitleView: UIButton!

//Sometime later...    
self.navigationItem.titleView = customFontTitleView

21

Experimente isto:

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor whiteColor],NSForegroundColorAttributeName,
                                [UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;

14

Meu código Swift para alterar o título da barra de navegação:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
self.navigationController.navigationBar.titleTextAttributes = attributes

E se você quiser alterar a fonte do plano de fundo também, eu tenho isso em meu AppDelegate:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)

8

ADICIONE este código de linha única em seu App Delegate - Did Finish Lauch. Isso mudará a fonte, a cor da barra de navegação em todo o aplicativo.

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont(name: "YOUR FONT NAME", size: 25.0)!]

5

Aqui está uma resposta para sua pergunta:

Mova seu código para o método abaixo porque o título da barra de navegação foi atualizado após o carregamento da visualização. Eu tentei adicionar o código acima em viewDidLoad não funciona, funciona bem no método viewDidAppear.

  -(void)viewDidAppear:(BOOL)animated{}

3

Qualquer pessoa precisa de uma versão Swift 3. redColor()mudou para apenas red.

self.navigationController?.navigationBar.titleTextAttributes =
        [NSForegroundColorAttributeName: UIColor.red,
         NSFontAttributeName: UIFont(name: "{your-font-name}", size: 21)!]

2

É um pouco mais legível usando literais:

self.navigationController.navigationBar.titleTextAttributes = @{
                                                              NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21],
                                                              NSForegroundColorAttributeName: [UIColor whiteColor]
                                                              };

2

Tive um problema porque, quando tentei alterar o título do meu NavigationItem de forma programática, não consegui encontrar a fonte da minha família (tentei muitas coisas, mas era impossível fazê-la funcionar corretamente), então encontrei uma solução alternativa muito boa e fácil no storyboard.

  1. Em primeiro lugar, você adiciona no Item de navegação uma visualização no meio e não se esqueça de definir backGroundColor como cor clara para ter a mesma cor da barra de navegação:

insira a descrição da imagem aqui

  1. Em seguida, você adiciona um rótulo que você pode editar (definir a cor do texto, fonte, tamanho ...) nesta visualização
  2. Você adiciona restrições ao rótulo (Superior = 0, Inferior = 0, Trailing = 0 e Leading = 0) para visualizar e centralizar o texto do rótulo

Finalmente, você deve ter algo assim no esboço do documento:

insira a descrição da imagem aqui

E algo parecido em seu ViewController:

insira a descrição da imagem aqui

Espero que possa ajudar.


2

Rápido:-

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Love Nature", size: 40)!]

1

Este para alternativa ao Swift 4 (já respondido por @Josh):

let titleTextAttributed: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.red, .font: UIFont(name: "AvenirNext-Regular", size: 20) as Any]
navigationController?.navigationBar.titleTextAttributes = titleTextAttributed

1

iOS 11

insira a descrição da imagem aqui

Objective-C

if (@available(iOS 11.0, *)) {
    self.navigationController.navigationItem.largeTitleDisplayMode =  UINavigationItemLargeTitleDisplayModeAlways;
    self.navigationController.navigationBar.prefersLargeTitles = true;

// Change Color
    self.navigationController.navigationBar.largeTitleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};

} else {
    // Fallback on earlier versions
}

1

Para Objective-C definir fonte e cor

- (void)_setup {
    NSDictionary *barButtonTitleAttributes = @{
                                               NSForegroundColorAttributeName : [UIColor whiteColor],
                                               NSFontAttributeName :[UIFont fontWithName:@"Lato-Regular" size:15.0]
                                               };
    [self.navigationBar setTitleTextAttributes:barButtonTitleAttributes];

}

0

Aqui está uma resposta para o Swift 4 😁:

    let textAttributes:[String:Any]? = [NSAttributedStringKey.foregroundColor.rawValue:UIColor.blue, NSAttributedStringKey.font.rawValue:UIFont(name:"Avenir Next", size:20)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes

0

Não se esqueça de adicionar os valores brutos das chaves para evitar erros de compilação.

    let textAttributes:[NSAttributedStringKey: Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue):UIColor.blue, NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue):UIFont(name:"OpenSans", size: 17)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes

0

Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
        [NSAttributedString.Key.foregroundColor: UIColor.white,
         NSAttributedString.Key.font: UIFont(name: "LemonMilklight", size: 21)!]

0

Adicionar esta extensão

extension UINavigationBar {
    func changeFont() {
        self.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Poppins-Medium", size: 17)!]
    }
}

Adicione a seguinte linha em viewDidLoad ()

self.navigationController?.navigationBar.changeFont()

-1

Working in swift 3.0 Para mudar a cor do título você precisa adicionar titleTextAttributes como este

        let textAttributes = [NSForegroundColorAttributeName:UIColor.white]
        self.navigationController.navigationBar.titleTextAttributes = textAttributes

For changing navigationBar background color you can use this
        self.navigationController.navigationBar.barTintColor = UIColor.white

For changing navigationBar back title and back arrow color you can use this
       self.navigationController.navigationBar.tintColor = UIColor.white
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.