Измените шрифт UIBarButtonItem

142

UIToolbar с UIBarButtonItem

У меня есть UIBarButtonItemв моем UIToolbarназвании Готово . Теперь я хочу изменить шрифт по умолчанию на «Trebuchet MS» с полужирным шрифтом. Как я могу это сделать?

Анкит Вьяс
источник

Ответы:

128

Поскольку UIBarButtonItem наследуется от UIBarItem, вы можете попробовать

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

но это только для iOS5. Для iOS 3/4 вам нужно будет использовать настраиваемый вид.

Teriiehina
источник
215

Чтобы быть точным, это можно сделать, как показано ниже

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

Или с синтаксисом литерала объекта:

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

Для удобства вот реализация Swift:

buttonItem.setTitleTextAttributes([
        NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 26.0)!,
        NSAttributedStringKey.foregroundColor: UIColor.green],
    for: .normal)
маска
источник
2
NSFontAttributeName следует использовать вместо UITextAttributeFont, а NSForegroundColorAttributeName следует использовать вместо UITextAttributeTextColor при разработке для IOS7.
Raz
128

Для тех, кто заинтересован в использовании UIAppearanceдля стилизации своих UIBarButtonItemшрифтов во всем приложении, это можно сделать с помощью этой строки кода:

Цель 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)

Или для одного UIBarButtonItem (не для всего приложения), если у вас есть собственный шрифт, в частности, для одной кнопки:

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

Конечно, вы можете изменить шрифт и размер на все, что захотите. Я предпочитаю поместить этот код в AppDelegate.mфайл в didFinishLaunchingWithOptionsразделе.

Доступные атрибуты (просто добавьте их в NSDictionary):

  • NSFontAttributeName: Изменить шрифт с помощью UIFont
  • NSForegroundColorAttributeName: Изменить цвет с помощью UIColor
  • NSShadow: Добавить тень (см. NSShadowСправочник по классу)

(Обновлено для iOS7 +)

рог
источник
3
Ключи UITextAttribute .. устарели в iOS7. Вместо этого используйте NSFontAttribute ... и NSForeground ... и т. Д.
Emmanuel Ay
2
Я обновился для устаревших версий iOS7. Спасибо за внимание, @EmmanuelAy!
rog
1
Фантастика! Мое приложение теперь выглядит красиво (ну, по-моему, это так !!: P) Спасибо
Septronic
20

В Swift вы бы сделали это следующим образом:

backButtonItem.setTitleTextAttributes([
        NSFontAttributeName : UIFont(name: "Helvetica-Bold", size: 26)!,
        NSForegroundColorAttributeName : UIColor.blackColor()],
    forState: UIControlState.Normal)
Антуан
источник
1
Не забудьте восклицательный знак (!) После шрифта. Сообщение об ошибке: «'_' не преобразовывается в 'String'» не очень полезно.
Ciryon
17

Это отличные ответы выше. Просто обновление для iOS7:

NSDictionary *barButtonAppearanceDict = @{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Thin" size:18.0] , NSForegroundColorAttributeName: [UIColor whiteColor]};
    [[UIBarButtonItem appearance] setTitleTextAttributes:barButtonAppearanceDict forState:UIControlStateNormal];
ICT1901
источник
16

Swift3

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

стремительный

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

Цель-C

     [ barbutton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIFont fontWithName:@"Helvetica-Bold" size:20.0], NSFontAttributeName,
        [UIColor redColor], NSForegroundColorAttributeName,[UIColor blackColor],NSBackgroundColorAttributeName,
        nil]
        forState:UIControlStateNormal];
Анбу.Картик
источник
8

Для некоторых, UIBarButtonItemsно не всех, я рекомендую следующий подход.

  1. Создайте UIBarButtonItemподкласс. Не добавляйте к нему ничего - вы будете использовать его только как настраиваемый класс в раскадровке и для его прокси внешнего вида ...
  2. В раскадровке измените пользовательский класс на все, что UIBarButtonItemsнужно для вашего подкласса.
  3. В вашем AppDelegate импортируйте свой UIBarButtonItemподкласс и добавьте следующую строку вapplication:didFinishLaunchingWithOptions:

В моем случае я выделил подклассы UIBarButtonItemс единственной целью - выделить текст жирным шрифтом:

[[BoldBarButtonItem appearance] setTitleTextAttributes:
  [NSDictionary dictionaryWithObjectsAndKeys: 
    [UIFont boldSystemFontOfSize:18.0], NSFontAttributeName,nil] 
                                              forState:UIControlStateNormal];
Кайл Клегг
источник
8

В Swift 4 вы можете изменить шрифт и цвет UIBarButtonItem, добавив следующий код.

addTodoBarButton.setTitleTextAttributes(
        [
        NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!,
        NSAttributedStringKey.foregroundColor: UIColor.black
        ], for: .normal)
Винот Вино
источник
5

Реализация Swift 5

rightButtonItem.setTitleTextAttributes([
            NSAttributedString.Key.font: UIFont(name: "Helvetica-Bold", size: 26.0)!,
            NSAttributedString.Key.foregroundColor: UIColor.green],
        for: .normal)
панкадж нигам
источник
4

Это правильный путь: объявите свой barButtonItem (в данном случае rightBarButtonItem) и добавьте его setTitleTextAttributes.

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

после того, как вы можете добавить атрибуты заголовка

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

вы можете изменить размер, вес (жирный, тяжелый, обычный и т. д.) и цвет по своему усмотрению ... Надеюсь на эту помощь :)

Фабио
источник
2

быстрый 3

barButtonName.setTitleTextAttributes( [NSFontAttributeName : UIFont.systemFont(ofSize: 18.0),NSForegroundColorAttributeName : UIColor.white], for: .normal) 
Venky
источник
1

Во всем приложении:

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

    }
Йогеш Лолусаре
источник
0

UIBarButtonне имеет свойства, связанного с изменением шрифта. Но вы можете создать кнопку с настраиваемым шрифтом, а затем добавить в UIBarButton. Возможно, это решит вашу проблему

Hiren
источник
0

Предполагая, что вы хотите поддерживать iOS4 и более ранние версии, лучше всего создать кнопку панели с помощью этого initWithCustomView:метода и предоставить собственное представление, которое может быть чем-то вроде UIButton, где вы можете легко настроить шрифт.

Вы также можете перетащить UIButton на панель инструментов или панель навигации в Интерфейсном Разработчике, если вы хотите создать кнопку с помощью перетаскивания, а не программно.

К сожалению, это означает создание фонового изображения кнопки самостоятельно. Невозможно настроить шрифт стандартного UIBarButtonItem до iOS5.

Ник Локвуд
источник
0

Вы можете создать кастом UIViewпрограммно:

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

Затем добавьте изображения, метки или что угодно в свой собственный вид:

[buttonItemView addSubview:customImage];

[buttonItemView addSubview:customLabel];

...

Теперь поместите его в свой UIBarButtomItem.

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

И, наконец, добавьте barButtonItem на панель навигации.

Джузеппе Гарассино
источник
0

В завершение я хотел бы добавить этот метод, который до сих пор используется в Objective-C в 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];
Питер Сувара
источник