Alterar a fonte de um UIBarButtonItem

139

UIToolbar com UIBarButtonItem

Eu tenho um UIBarButtonItemno meu UIToolbartítulo Concluído . Agora eu quero alterar a fonte do padrão para "Trebuchet MS" com negrito. Como eu posso fazer isso?

Ankit Vyas
fonte

Respostas:

126

Como UIBarButtonItem herda de UIBarItem, você pode tentar

- (void)setTitleTextAttributes:(NSDictionary *)attributes
                  forState:(UIControlState)state

mas isso é apenas para iOS5. Para o iOS 3/4, você precisará usar uma exibição personalizada.

teriiehina
fonte
214

Para ser mais preciso, isso pode ser feito como abaixo

[buttonItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: 
    [UIFont fontWithName:@"Helvetica-Bold" size:26.0], NSFontAttributeName,
    [UIColor greenColor], NSForegroundColorAttributeName,
    nil] 
                          forState:UIControlStateNormal];

Ou com a sintaxe literal do objeto:

[buttonItem setTitleTextAttributes:@{
     NSFontAttributeName: [UIFont fontWithName:@"Helvetica-Bold" size:26.0],
     NSForegroundColorAttributeName: [UIColor greenColor]
} forState:UIControlStateNormal];

Por conveniência, aqui está a implementação do Swift:

buttonItem.setTitleTextAttributes([
        NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 26.0)!,
        NSAttributedStringKey.foregroundColor: UIColor.green],
    for: .normal)
mascarar
fonte
2
NSFontAttributeName deve ser usado em vez de UITextAttributeFont, e NSForegroundColorAttributeName deve ser em vez de UITextAttributeTextColor ao desenvolver para o IOS7.
Raz
126

Para aqueles interessados ​​em usar o UIAppearanceestilo de suas UIBarButtonItemfontes em todo o aplicativo, isso pode ser feito usando esta linha de código:

Objetivo C:

NSDictionary *barButtonAppearanceDict = @{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:12.0], NSForegroundColorAttributeName: [UIColor whiteColor]};
[[UIBarButtonItem appearance] setTitleTextAttributes:barButtonAppearanceDict forState:UIControlStateNormal];

Swift 2.3:

UIBarButtonItem.appearance().setTitleTextAttributes(
[
    NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: 12)!,
    NSForegroundColorAttributeName : UIColor.white
],
for: .normal)

Swift 3

UIBarButtonItem.appearance().setTitleTextAttributes(
[
    NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: 12)!,
    NSForegroundColorAttributeName : UIColor.white,
], for: .normal)

Swift 4

UIBarButtonItem.appearance().setTitleTextAttributes(
[
    NSAttributedStringKey.font : UIFont(name: "HelveticaNeue-Light", size: 12)!,
    NSAttributedStringKey.foregroundColor : UIColor.white,
], for: .normal)

Ou para um único UIBarButtonItem (não para todo o aplicativo), se você tiver uma fonte personalizada para um botão em particular:

Swift 3

let barButtonItem = UIBarButton()
barButtonItem.setTitleTextAttributes([
    NSFontAttributeName : UIFont(name: "FontAwesome", size: 26)!,
    NSForegroundColorAttributeName : UIColor.white,
], for: .normal)
barButtonItem.title = "\u{f02a}"

Swift 4

let barButtonItem = UIBarButton()
barButtonItem.setTitleTextAttributes([
    NSAttributedStringKey.font : UIFont(name: "FontAwesome", size: 26)!,
    NSAttributedStringKey.foregroundColor : UIColor.white,
], for: .normal)
barButtonItem.title = "\u{f02a}"

Obviamente, você pode alterar a fonte e o tamanho para o que quiser. Eu prefiro colocar esse código no AppDelegate.marquivo na didFinishLaunchingWithOptionsseção

Atributos disponíveis (basta adicioná-los ao NSDictionary):

  • NSFontAttributeName: Alterar fonte com um UIFont
  • NSForegroundColorAttributeName: Altere a cor com um UIColor
  • NSShadow: Adicione uma sombra projetada (consulte a NSShadowreferência da classe)

(Atualizado para iOS7 +)

rog
fonte
3
As chaves UITextAttribute .. estão obsoletas no iOS7. Use NSFontAttribute ... e NSForeground ... etc.
Emmanuel Ay
2
Atualizei para as substituições introduzidas no iOS7. Obrigado pelo aviso, @EmmanuelAy!
rog
1
Fantástico! Meu aplicativo está bonito agora (bem, da minha maneira, isso é !!: P) Obrigado
Septronic 3/15/15
20

No Swift, você faria o seguinte:

backButtonItem.setTitleTextAttributes([
        NSFontAttributeName : UIFont(name: "Helvetica-Bold", size: 26)!,
        NSForegroundColorAttributeName : UIColor.blackColor()],
    forState: UIControlState.Normal)
Antoine
fonte
1
Não esqueça o ponto de exclamação (!) Após a fonte. A mensagem de erro: "'_' não é conversível em 'String'" não é realmente útil.
Ciryon 3/09/15
17

Estas são ótimas respostas acima. Apenas atualizando para iOS7:

NSDictionary *barButtonAppearanceDict = @{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Thin" size:18.0] , NSForegroundColorAttributeName: [UIColor whiteColor]};
    [[UIBarButtonItem appearance] setTitleTextAttributes:barButtonAppearanceDict forState:UIControlStateNormal];
TheGeezer
fonte
16

Swift3

  buttonName.setAttributedTitle([
        NSFontAttributeName : UIFont.systemFontOfSize(18.0),
        NSForegroundColorAttributeName : UIColor.red,NSBackgroundColorAttributeName:UIColor.black],
                                     forState: UIControlState.Normal)

rápido

   barbutton.setTitleTextAttributes([
        NSFontAttributeName : UIFont.systemFontOfSize(18.0),
        NSForegroundColorAttributeName : UIColor.redColor(),NSBackgroundColorAttributeName:UIColor.blackColor()],
        forState: UIControlState.Normal)

Objetivo-C

     [ barbutton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIFont fontWithName:@"Helvetica-Bold" size:20.0], NSFontAttributeName,
        [UIColor redColor], NSForegroundColorAttributeName,[UIColor blackColor],NSBackgroundColorAttributeName,
        nil]
        forState:UIControlStateNormal];
Anbu.Karthik
fonte
8

Para fazer isso para alguns, UIBarButtonItemsmas não para todos, recomendo a seguinte abordagem.

  1. Crie uma UIBarButtonItemsubclasse. Não adicione nada a ele - você o usará apenas como uma classe personalizada no storyboard e como proxy de aparência ...
  2. No seu storyboard, altere a classe personalizada de todas as desejadas UIBarButtonItemspara sua subclasse
  3. No AppDelegate, importe sua UIBarButtonItemsubclasse e adicione a seguinte linha aapplication:didFinishLaunchingWithOptions:

No meu caso, subclassifiquei UIBarButtonItemcom o único propósito de colocar o texto em negrito:

[[BoldBarButtonItem appearance] setTitleTextAttributes:
  [NSDictionary dictionaryWithObjectsAndKeys: 
    [UIFont boldSystemFontOfSize:18.0], NSFontAttributeName,nil] 
                                              forState:UIControlStateNormal];
Kyle Clegg
fonte
8

No Swift 4 , você pode alterar a fonte e a cor UIBarButtonItemadicionando o código a seguir.

addTodoBarButton.setTitleTextAttributes(
        [
        NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!,
        NSAttributedStringKey.foregroundColor: UIColor.black
        ], for: .normal)
Vinoth Vino
fonte
3

Este é o caminho certo: declare seu barButtonItem (neste caso rightBarButtonItem) e adicione-o setTitleTextAttributes.

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Go!", style: .plain, target: self, action: #selector(yourFuncDestination))

depois de adicionar atributos de título

navigationItem.rightBarButtonItem?.setTitleTextAttributes([.font : UIFont.systemFont(ofSize: 18, weight: .bold), .foregroundColor : UIColor.white], for: .normal)

você pode alterar o tamanho, o peso (. negrito,. pesado,. regular etc.) e a cor como preferir ... Espero que ajude :)

Fabio
fonte
3

Implementação do Swift 5

rightButtonItem.setTitleTextAttributes([
            NSAttributedString.Key.font: UIFont(name: "Helvetica-Bold", size: 26.0)!,
            NSAttributedString.Key.foregroundColor: UIColor.green],
        for: .normal)
pankaj nigam
fonte
2

rápido 3

barButtonName.setTitleTextAttributes( [NSFontAttributeName : UIFont.systemFont(ofSize: 18.0),NSForegroundColorAttributeName : UIColor.white], for: .normal) 
venky
fonte
1

Em todo o aplicativo:

if let font = UIFont(name: "AvenirNext-DemiBold", size: 15) {
        UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: font,NSForegroundColorAttributeName:TOOLBAR_TITLE_COLOR], forState: UIControlState.Normal)

    }
Yogesh Lolusare
fonte
0

UIBarButtonnão possui propriedades relacionadas à alteração da fonte. Mas você pode criar um botão com fonte personalizada e adicionar ao UIBarButton. Pode ser resolvido o seu problema

Hiren
fonte
0

Supondo que você queira oferecer suporte ao iOS4 e versões anteriores, sua melhor aposta é criar um botão de barra usando o initWithCustomView:método e fornecer sua própria visualização, que pode ser algo como um UIButton, no qual você pode personalizar facilmente a fonte.

Você também pode arrastar um UIButton para uma barra de ferramentas ou barra de navegação no Interface Builder, se desejar criar o botão com arrastar e soltar, em vez de programaticamente.

Infelizmente, isso significa criar você mesmo a imagem de fundo do botão. Não há como personalizar a fonte de um UIBarButtonItem padrão antes do iOS5.

Nick Lockwood
fonte
0

Você pode criar um personalizado UIViewprogramaticamente:

UIView *buttonItemView = [[UIView alloc] initWithFrame:buttonFrame];

Em seguida, adicione imagens, etiquetas ou o que quiser à sua visualização personalizada:

[buttonItemView addSubview:customImage];

[buttonItemView addSubview:customLabel];

...

Agora coloque no seu UIBarButtomItem.

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:buttonItemView];

E, finalmente, adicione barButtonItem à sua barra de navegação.

Giuseppe Garassino
fonte
0

Para concluir, gostaria de adicionar este método, ainda usado no Objective-C em 2019. :)

_titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
_titleLabel.text = _titleBarButtonItem.title;
_titleLabel.textColor = UIColor.whiteColor;
_titleLabel.font = [UtilityMethods appFontProDisplayBold:26.0];

[_titleLabel sizeToFit];
UIBarButtonItem *titleLabelItem = [[UIBarButtonItem alloc] initWithCustomView:_titleLabel];
Peter Suwara
fonte