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?

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.


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)

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 +)


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)

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];

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];

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];

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)

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 :)


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)

2

rápido 3

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

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)

    }

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


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.


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.


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];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.