Cambiar la fuente de un UIBarButtonItem

139

UIToolbar con UIBarButtonItem

Tengo un UIBarButtonItemen mi UIToolbartitulado Listo . Ahora quiero cambiar la fuente por defecto a "Trebuchet MS" con Bold. ¿Cómo puedo hacer eso?

Ankit Vyas
fuente

Respuestas:

126

Como UIBarButtonItem hereda de UIBarItem, puede intentar

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

pero esto es solo para iOS5. Para iOS 3/4, deberá usar una vista personalizada.

teriiehina
fuente
214

Para ser precisos, esto se puede hacer de la siguiente manera

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

O con la sintaxis literal del objeto:

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

Por conveniencia, aquí está la implementación de Swift:

buttonItem.setTitleTextAttributes([
        NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 26.0)!,
        NSAttributedStringKey.foregroundColor: UIColor.green],
    for: .normal)
máscara
fuente
2
NSFontAttributeName debe usarse en su lugar UITextAttributeFont, y NSForegroundColorAttributeName debe usarse en lugar de UITextAttributeTextColor al desarrollar para IOS7.
Raz
126

Para aquellos interesados ​​en usar el UIAppearanceestilo de sus UIBarButtonItemfuentes en toda la aplicación, se puede lograr usando esta línea de código:

C objetivo:

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)

O para un solo UIBarButtonItem (no para toda la aplicación), si tiene una fuente personalizada para un botón en 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}"

Por supuesto, puede cambiar la fuente y el tamaño a lo que desee. Prefiero poner este código en el AppDelegate.marchivo en la didFinishLaunchingWithOptionssección.

Atributos disponibles (solo agréguelos a NSDictionary):

  • NSFontAttributeName: Cambiar fuente con un UIFont
  • NSForegroundColorAttributeName: Cambiar color con un UIColor
  • NSShadow: Agregar una sombra paralela (ver NSShadowreferencia de clase)

(Actualizado para iOS7 +)

rog
fuente
3
Las claves UITextAttribute .. están en desuso a partir de iOS7. Utilice NSFontAttribute ... y NSForeground ... etc en su lugar.
Emmanuel Ay
2
He actualizado las obsolescencias introducidas en iOS7. Gracias por el aviso, @EmmanuelAy!
rog
1
¡Fantástico! Mi aplicación se ve hermosa ahora (bueno, a mi manera, eso es !!: P) Gracias
Septronic
20

En Swift harías esto de la siguiente manera:

backButtonItem.setTitleTextAttributes([
        NSFontAttributeName : UIFont(name: "Helvetica-Bold", size: 26)!,
        NSForegroundColorAttributeName : UIColor.blackColor()],
    forState: UIControlState.Normal)
Antoine
fuente
1
No olvide el signo de exclamación (!) Después de la fuente. El mensaje de error: "'_' no es convertible a 'String'" no es realmente útil.
Ciryon
17

Estas son excelentes respuestas anteriores. Solo actualizando para iOS7:

NSDictionary *barButtonAppearanceDict = @{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Thin" size:18.0] , NSForegroundColorAttributeName: [UIColor whiteColor]};
    [[UIBarButtonItem appearance] setTitleTextAttributes:barButtonAppearanceDict forState:UIControlStateNormal];
TheGeezer
fuente
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)

C objetivo

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

Para hacer esto para algunos UIBarButtonItemspero no para todos, recomiendo el siguiente enfoque.

  1. Crea una UIBarButtonItemsubclase. No le agregue nada, solo lo usará como una clase personalizada en el guión gráfico y por su proxy de apariencia ...
  2. En su guión gráfico, cambie la clase personalizada para todos los deseados UIBarButtonItemsa su subclase
  3. En su AppDelegate, importe su UIBarButtonItemsubclase y agregue la siguiente línea aapplication:didFinishLaunchingWithOptions:

En mi caso, subclasifiqué UIBarButtonItemcon el único propósito de poner en negrita el texto:

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

En Swift 4 , puede cambiar la fuente y el color UIBarButtonItemagregando el siguiente código.

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

Esta es la forma correcta: declare su barButtonItem (en este caso rightBarButtonItem) y agréguelo setTitleTextAttributes.

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

después de que pueda agregar atributos de título

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

puedes cambiar el tamaño, el peso (. negrita, .pesado, .regular, etc.) y el color como prefieras ... Espero que esto ayude :)

Fabio
fuente
3

Implementación de Swift 5

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

rápido 3

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

En toda la aplicación:

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

    }
Yogesh Lolusare
fuente
0

UIBarButtonno tiene propiedades relacionadas para cambiar la fuente. Pero puede crear un botón con fuente personalizada y luego agregarlo a UIBarButton. Puede resolverse tu problema

Hiren
fuente
0

Suponiendo que desea admitir iOS4 y versiones anteriores, su mejor opción es crear un botón de barra utilizando el initWithCustomView:método y proporcionar su propia vista, que podría ser algo así como un UIButton donde puede personalizar fácilmente la fuente.

También puede arrastrar un UIButton a una barra de herramientas o barra de navegación en Interface Builder si desea crear el botón con arrastrar y soltar en lugar de mediante programación.

Desafortunadamente, esto significa crear la imagen de fondo del botón usted mismo. No hay forma de personalizar la fuente de un UIBarButtonItem estándar antes de iOS5.

Nick Lockwood
fuente
0

Puede crear una UIViewprogramación personalizada :

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

Luego agregue imágenes, etiquetas o lo que quiera a su vista personalizada:

[buttonItemView addSubview:customImage];

[buttonItemView addSubview:customLabel];

...

Ahora ponlo en tu UIBarButtomItem.

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

Y finalmente agregue barButtonItem a su barra de navegación.

Giuseppe Garassino
fuente
0

Para completar, me gustaría agregar este método, que todavía se usa en Objective-C en 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
fuente