Change the font of a UIBarButtonItem

IosCocoa TouchUibarbuttonitem

Ios Problem Overview


UIToolbar with UIBarButtonItem

I have a UIBarButtonItem in my UIToolbar titled Done. Now I want to change the font from the default to "Trebuchet MS" with Bold. How can I do that?

Ios Solutions


Solution 1 - Ios

To be precise, this can be done as below

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

Or with object literal syntax:

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

For convenience, here's the Swift implementation:

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

Solution 2 - Ios

For those interested in using UIAppearance to style their UIBarButtonItem's fonts throughout the app, it can be accomplished using this line of code:

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

Or for a single UIBarButtonItem (not for all app wide), if you have a custom font for one button in 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}"

Of course, you can change the font & size to whatever you'd like. I prefer to put this code in the AppDelegate.m file in the didFinishLaunchingWithOptions section.

Available attributes (just add them to the NSDictionary):

  • NSFontAttributeName: Change font with a UIFont
  • NSForegroundColorAttributeName: Change color with a UIColor
  • NSShadow: Add a drop shadow (see NSShadow class reference)

(Updated for iOS7+)

Solution 3 - Ios

Because UIBarButtonItem inherits from UIBarItem, you can try

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

but this is for iOS5 only. For iOS 3/4, you will have to use a custom view.

Solution 4 - Ios

In Swift you would do this as followed:

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

Solution 5 - Ios

These are great answers above. Just updating for iOS7:

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

Solution 6 - Ios

Swift3

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

swift

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

Solution 7 - Ios

Swift 5 Implementation

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

Solution 8 - Ios

To do this for some UIBarButtonItems but not all I recommend the following approach.

  1. Create a UIBarButtonItem subclass. Don't add anything to it - you will only use it as a custom class in the storyboard and for its appearance proxy...
  2. In your storyboard, change the custom class for all desired UIBarButtonItems to your subclass
  3. In your AppDelegate import your UIBarButtonItem subclass and add the following line to application:didFinishLaunchingWithOptions:

In my case I subclassed UIBarButtonItem for the sole purpose of bolding the text:

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

Solution 9 - Ios

In Swift 4, you can change the font and colour of UIBarButtonItem by adding the following code.

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

Solution 10 - Ios

This is the right way: declare your barButtonItem (in this case rightBarButtonItem) and add it setTitleTextAttributes.

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

after you can add title attributes

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

you can change the size, the weight (.bold, .heavy, .regular etc.) and the color how you prefer... Hope this help :)

Solution 11 - Ios

swift 3

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

                             

Solution 12 - Ios

Throughout App:

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

Solution 13 - Ios

UIBarButton haven't property related to change the font. But you can create a button with custom font and then add into UIBarButton. It May be solved your problem

Solution 14 - Ios

Assuming you want to support iOS4 and earlier, your best bet is to create a bar button using the initWithCustomView: method and supply your own view which could be something like a UIButton where you can easily customise the font.

You can also drag a UIButton onto a toolbar or navigation bar in Interface Builder if you want to create the button with drag-and-drop instead of programmatically.

Unfortunately this means creating the button background image yourself. There's no way to customise the font of a standard UIBarButtonItem prior to iOS5.

Solution 15 - Ios

You can create a custom UIView programmatically:

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

Then add images, labels or whatever you like to your custom view:

[buttonItemView addSubview:customImage];

[buttonItemView addSubview:customLabel];

...

Now put it in your UIBarButtomItem.

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

And finally add barButtonItem to you navigation bar.

Solution 16 - Ios

For completion I would like to add this method, still used in Objective-C in 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];

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAnkit VyasView Question on Stackoverflow
Solution 1 - IosmaskView Answer on Stackoverflow
Solution 2 - IosrogView Answer on Stackoverflow
Solution 3 - IosteriiehinaView Answer on Stackoverflow
Solution 4 - IosAntoineView Answer on Stackoverflow
Solution 5 - IosICL1901View Answer on Stackoverflow
Solution 6 - IosAnbu.KarthikView Answer on Stackoverflow
Solution 7 - Iospankaj nigamView Answer on Stackoverflow
Solution 8 - IosKyle CleggView Answer on Stackoverflow
Solution 9 - IosVinoth VinoView Answer on Stackoverflow
Solution 10 - IosFabioView Answer on Stackoverflow
Solution 11 - IosvenkyView Answer on Stackoverflow
Solution 12 - IosYogesh LolusareView Answer on Stackoverflow
Solution 13 - IosHirenView Answer on Stackoverflow
Solution 14 - IosNick LockwoodView Answer on Stackoverflow
Solution 15 - IosGiuseppe GarassinoView Answer on Stackoverflow
Solution 16 - IosPeter SuwaraView Answer on Stackoverflow