Cambia il carattere di un UIBarButtonItem


139

UIToolbar con UIBarButtonItem

Ho un UIBarButtonItemmio UIToolbarIntitolato Fatto . Ora voglio cambiare il carattere dal default a "Trebuchet MS" con Bold. Come lo posso fare?

Risposte:


126

Poiché UIBarButtonItem eredita da UIBarItem, puoi provare

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

ma questo è solo per iOS5. Per iOS 3/4, dovrai utilizzare una vista personalizzata.


214

Per essere precisi, questo può essere fatto come di seguito

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

O con la sintassi letterale dell'oggetto:

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

Per comodità, ecco l'implementazione di Swift:

buttonItem.setTitleTextAttributes([
        NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 26.0)!,
        NSAttributedStringKey.foregroundColor: UIColor.green],
    for: .normal)

2
NSFontAttributeName dovrebbe essere usato invece di UITextAttributeFont e NSForegroundColorAttributeName dovrebbe essere invece di UITextAttributeTextColor durante lo sviluppo per IOS7.
Raz,

126

Per coloro che sono interessati a utilizzare UIAppearancelo stile dei propri UIBarButtonItemcaratteri in tutta l'app, può essere realizzato utilizzando questa riga di codice:

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

O per un singolo UIBarButtonItem (non per tutta l'app), se hai un carattere personalizzato per un pulsante in particolare:

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}"

Ovviamente, puoi modificare il carattere e le dimensioni in base alle tue esigenze. Preferisco inserire questo codice nel AppDelegate.mfile nella didFinishLaunchingWithOptionssezione.

Attributi disponibili (basta aggiungerli a NSDictionary):

  • NSFontAttributeName: Cambia carattere con a UIFont
  • NSForegroundColorAttributeName: Cambia colore con a UIColor
  • NSShadow: Aggiungi un'ombra discendente (vedi NSShadowriferimento alla classe)

(Aggiornato per iOS7 +)


3
Le chiavi UITextAttribute .. sono obsolete a partire da iOS7. Utilizzare invece NSFontAttribute ... e NSForeground ... ecc.
Emmanuel Ay

2
Ho aggiornato per le deprecazioni introdotte in iOS7. Grazie per il testa a testa, @EmmanuelAy!
rog

1
Fantastico! La mia app è bellissima ora (beh, a modo mio che è !!: P) Grazie
Septronic,

20

In Swift lo faresti come segue:

backButtonItem.setTitleTextAttributes([
        NSFontAttributeName : UIFont(name: "Helvetica-Bold", size: 26)!,
        NSForegroundColorAttributeName : UIColor.blackColor()],
    forState: UIControlState.Normal)

1
Non dimenticare il punto esclamativo (!) Dopo il carattere. Il messaggio di errore: "'_' non è convertibile in 'String'" non è davvero utile.
Ciryon,

17

Queste sono ottime risposte sopra. Solo aggiornamento per 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)

veloce

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

Objective-C

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

8

Per fare questo per alcuni, UIBarButtonItemsma non per tutti, consiglio il seguente approccio.

  1. Creare un UIBarButtonItem sottoclasse. Non aggiungere nulla ad esso: lo utilizzerai solo come classe personalizzata nello storyboard e per il suo proxy di aspetto ...
  2. Nello storyboard, modifica la classe personalizzata per tutti i desiderati UIBarButtonItems nella sottoclasse
  3. Nel tuo AppDelegate importa la tua UIBarButtonItemsottoclasse e aggiungi la seguente riga aapplication:didFinishLaunchingWithOptions:

Nel mio caso ho eseguito UIBarButtonItemuna sottoclasse al solo scopo di mettere in grassetto il testo:

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

8

In Swift 4 , puoi modificare il carattere e il colore di UIBarButtonItemaggiungendo il seguente codice.

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

4

Questo è il modo giusto: dichiarare barButtonItem (in questo caso rightBarButtonItem) e aggiungerlo setTitleTextAttributes.

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

dopo aver aggiunto gli attributi del titolo

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

puoi cambiare le dimensioni, il peso (.bold, .heavy, .regular ecc.) e il colore come preferisci ... Spero che questo aiuto :)


3

Implementazione rapida 5

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

2

veloce 3

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

1

In tutta l'app:

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

    }

0

UIBarButtonnon ha proprietà correlate per modificare il carattere. Ma puoi creare un pulsante con un carattere personalizzato e quindi aggiungerlo in UIBarButton. Potrebbe essere risolto il tuo problema


0

Supponendo che tu voglia supportare iOS4 e precedenti, la soluzione migliore è quella di creare un pulsante a barra usando il initWithCustomView:metodo e fornire la tua vista che potrebbe essere qualcosa come un UIButton in cui puoi facilmente personalizzare il carattere.

Puoi anche trascinare un UIButton su una barra degli strumenti o sulla barra di navigazione in Interface Builder se desideri creare il pulsante con il trascinamento della selezione anziché a livello di programmazione.

Purtroppo questo significa creare l'immagine di sfondo del pulsante da soli. Non è possibile personalizzare il carattere di un UIBarButtonItem standard prima di iOS5.


0

È possibile creare un personalizzato a livello di UIViewcodice:

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

Quindi aggiungi immagini, etichette o qualsiasi cosa ti piaccia alla visualizzazione personalizzata:

[buttonItemView addSubview:customImage];

[buttonItemView addSubview:customLabel];

...

Ora mettilo nel tuo UIBarButtomItem.

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

E infine aggiungi barButtonItem alla barra di navigazione.


0

Per il completamento, vorrei aggiungere questo metodo, ancora utilizzato in Objective-C nel 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];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.