iOS изменить шрифт и цвет заголовка панели навигации

102

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

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
                                                                       fontWithName:_dataManager.optionsSettings.fontString size:14], NSFontAttributeName,
                            [UIColor whiteColor], NSForegroundColorAttributeName, nil];

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

Изменение шрифта кнопки возврата с помощью этого кода работает нормально.

   //set backbutton font
NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [UIFont fontWithName:_dataManager.optionsSettings.fontString size:15], NSFontAttributeName,
                                  nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes
                                            forState:UIControlStateNormal];
aZtraL-EnForceR
источник

Ответы:

252

Правильный способ изменить шрифт (и цвет) заголовка:

[self.navigationController.navigationBar setTitleTextAttributes:
 @{NSForegroundColorAttributeName:[UIColor redColor],
NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21]}];

Изменить: Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: UIColor.red,
 NSAttributedString.Key.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Изменить: Swift 4

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedStringKey.foregroundColor: UIColor.red,
 NSAttributedStringKey.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Swift 3:

self.navigationController?.navigationBar.titleTextAttributes = 
[NSForegroundColorAttributeName: UIColor.redColor(),
 NSFontAttributeName: UIFont(name: "mplus-1c-regular", size: 21)!]
Брайан
источник
3
Размер остается неизменным независимо от того, какое значение я пробую
Рафаэль Ройер-Ривар
1
Да, я понял, что мой шрифт неправильно загружен. Все еще не могу понять, почему, я импортировал OpenSans-Light и OpenSans-Regular таким же образом, только OpenSans-Light кажется пригодным для использования ...
Рафаэль Ройер-Ривард
1
В коде Obj-C отсутствует закрывающая скобка. Это должно быть: [self.navigationController.navigationBar setTitleTextAttributes: @ {NSForegroundColorAttributeName: [UIColor redColor], NSFontAttributeName: [UIFont fontWithName: @ "mplus-1c-regular" size: 21]}];
Дилан Хэнд
перейти по ссылке для изменения шрифта backBarButton: stackoverflow.com/a/16538596/5967144
soorej babu 03
А как насчет использования LargeTitle NavBar? Я не нахожу navigationBar.LargeTitleTextAttributesничего в этом отношении. Вы знаете, как установить глобальный шрифт LargeTitle?
iKK
54

В других ответах нет ничего плохого. Я просто делюсь версией раскадровки для установки шрифта.

1. Выберите панель навигации в контроллере навигации.

панель навигации

2. Измените шрифт заголовка в инспекторе атрибутов.

шрифт заголовка

(Вам, вероятно, потребуется переключить оттенок панели для панели навигации, прежде чем Xcode подберет новый шрифт)

Примечания (предостережения)

Проверено, что это работает на Xcode 7.1.1+. ( См. Образцы ниже )

  1. Вам нужно переключить оттенок панели навигации, прежде чем шрифт вступит в силу (похоже на ошибку в Xcode; вы можете переключить его обратно на значение по умолчанию, и шрифт останется)
  2. Если вы выбираете системный шрифт ~ Убедитесь, что размер не равен 0,0 (иначе новый шрифт будет проигнорирован)

размер

  1. Похоже, это работает без проблем, когда только один NavBar находится в иерархии представления. Похоже, что вторичные панели навигации в том же стеке игнорируются. (Обратите внимание, что если вы показываете панель навигации главного контроллера навигации, все остальные пользовательские настройки панели навигации игнорируются).

Попался (два)

Некоторые из них повторяются, а это значит, что их, скорее всего, стоит отметить.

  1. Иногда XML раскадровки повреждается. Для этого необходимо просмотреть структуру в режиме «Раскадровка как исходный код» (щелкните правой кнопкой мыши файл раскадровки> «Открыть как ...»).
  2. В некоторых случаях тег navigationItem, связанный с определенным пользователем атрибутом среды выполнения, был установлен как дочерний элемент xml тега представления вместо тега контроллера представления. В таком случае удалите его между тегами для правильной работы.
  3. Переключите оттенок NavBar, чтобы убедиться, что используется настраиваемый шрифт.
  4. Проверьте параметр размера шрифта, если не используется стиль динамического шрифта
  5. Иерархия просмотра переопределит настройки. Похоже, что возможен один шрифт на стопку.

Результат

навигационная панель-курсив

Образцы

Обработка пользовательских шрифтов

Примечание ~ Хороший контрольный список можно найти на веб-сайте Code With Chris, и вы можете увидеть образец загружаемого проекта.

Если у вас есть собственный шрифт и вы хотите использовать его в своей раскадровке, то на следующий вопрос SO есть достойный набор ответов . Один ответ определяет эти шаги.

  1. Получите собственный файл шрифта (.ttf, .ttc)
  2. Импортируйте файлы шрифтов в свой проект Xcode
  3. В app-info.plist добавьте ключ с именем Fonts, предоставляемый приложением. Это тип массива, добавьте все имена файлов шрифтов в массив, примечание: включая расширение файла.
  4. В раскадровке на панели навигации перейдите к инспектору атрибутов, нажмите правую кнопку значка в области выбора шрифта. Во всплывающей панели выберите «Шрифт на выбор» и выберите семейство встроенного шрифта.

Обходное решение для пользовательского шрифта

Таким образом, Xcode, естественно, выглядит так, как будто он может обрабатывать пользовательские шрифты в UINavigationItem, но эта функция просто не обновляется должным образом (выбранный шрифт игнорируется).

UINavigationItem

Чтобы обойти это:

Один из способов - исправить использование раскадровки и добавить строку кода: сначала добавьте UIView (UIButton, UILabel или какой-либо другой подкласс UIView) в контроллер представления (не элемент навигации ... Xcode в настоящее время не позволяет делать который). После добавления элемента управления вы можете изменить шрифт в раскадровке и добавить ссылку в качестве выхода в контроллер представления. Просто назначьте это представление для UINavigationItem.titleView. При необходимости вы также можете указать текстовое имя в коде. Сообщил об ошибке (23600285).

@IBOutlet var customFontTitleView: UIButton!

//Sometime later...    
self.navigationItem.titleView = customFontTitleView
Томми К.
источник
21

Попробуй это:

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor whiteColor],NSForegroundColorAttributeName,
                                [UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;
Акки
источник
14

Мой код Swift для изменения заголовка панели навигации:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
self.navigationController.navigationBar.titleTextAttributes = attributes

И если вы тоже хотите изменить шрифт фона, у меня есть это в моем AppDelegate:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)
Либор Заплетал
источник
8

ДОБАВИТЬ этот однострочный код в свой App Delegate - Did Finish Lauch. Он изменит шрифт, цвет панели навигации во всем приложении.

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont(name: "YOUR FONT NAME", size: 25.0)!]
Рениш Дадхания
источник
5

Вот ответ на ваш вопрос:

Переместите свой код в метод ниже, потому что заголовок панели навигации обновляется после загрузки представления. Я попытался добавить приведенный выше код в viewDidLoad, не работает, он отлично работает в методе viewDidAppear.

  -(void)viewDidAppear:(BOOL)animated{}
Правин Хайремат
источник
3

Всем нужна версия Swift 3. redColor()изменилось на просто red.

self.navigationController?.navigationBar.titleTextAttributes =
        [NSForegroundColorAttributeName: UIColor.red,
         NSFontAttributeName: UIFont(name: "{your-font-name}", size: 21)!]
Карл Тейлор
источник
2

С помощью литералов это немного удобнее:

self.navigationController.navigationBar.titleTextAttributes = @{
                                                              NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21],
                                                              NSForegroundColorAttributeName: [UIColor whiteColor]
                                                              };
sPoz
источник
2

У меня была одна проблема, потому что, когда я попытался программно изменить заголовок NavigationItem, я не смог найти свой семейный шрифт (пробовал много вещей, но не смог заставить его работать правильно), поэтому я нашел одно очень приятное и простое решение в раскадровке.

  1. Сначала вы добавляете в элемент навигации одно представление посередине и не забываете установить backGroundColor, чтобы очистить цвет, чтобы он имел тот же цвет, что и navBar:

введите описание изображения здесь

  1. Затем вы добавляете одну метку, которую вы можете редактировать (установить цвет текста, шрифт, размер ...) в этом представлении.
  2. Вы добавляете ограничения к метке (верхний = 0, нижний = 0, конечный = 0 и ведущий = 0) для просмотра и центрируйте текст метки

Наконец, у вас должно быть что-то подобное в структуре документа:

введите описание изображения здесь

И что-то подобное в вашем ViewController:

введите описание изображения здесь

Надеюсь, это поможет.

О. Бужауан
источник
2

Свифт: -

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Love Nature", size: 40)!]
Картик
источник
1

Это альтернатива Swift 4 (уже ответил @Josh):

let titleTextAttributed: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.red, .font: UIFont(name: "AvenirNext-Regular", size: 20) as Any]
navigationController?.navigationBar.titleTextAttributes = titleTextAttributed
Хендра Кусумах
источник
1

iOS 11

введите описание изображения здесь

Цель-C

if (@available(iOS 11.0, *)) {
    self.navigationController.navigationItem.largeTitleDisplayMode =  UINavigationItemLargeTitleDisplayModeAlways;
    self.navigationController.navigationBar.prefersLargeTitles = true;

// Change Color
    self.navigationController.navigationBar.largeTitleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};

} else {
    // Fallback on earlier versions
}
Вивек
источник
1

Для Objective-C для установки шрифта и цвета

- (void)_setup {
    NSDictionary *barButtonTitleAttributes = @{
                                               NSForegroundColorAttributeName : [UIColor whiteColor],
                                               NSFontAttributeName :[UIFont fontWithName:@"Lato-Regular" size:15.0]
                                               };
    [self.navigationBar setTitleTextAttributes:barButtonTitleAttributes];

}
Хардик Таккар
источник
0

Вот ответ для Swift 4 😁:

    let textAttributes:[String:Any]? = [NSAttributedStringKey.foregroundColor.rawValue:UIColor.blue, NSAttributedStringKey.font.rawValue:UIFont(name:"Avenir Next", size:20)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
Джош
источник
0

Не забудьте добавить необработанные значения ключей, чтобы избежать ошибок компиляции.

    let textAttributes:[NSAttributedStringKey: Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue):UIColor.blue, NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue):UIFont(name:"OpenSans", size: 17)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
Джеймс Рочабрун
источник
0

Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
        [NSAttributedString.Key.foregroundColor: UIColor.white,
         NSAttributedString.Key.font: UIFont(name: "LemonMilklight", size: 21)!]
Ilkayaktas
источник
0

Добавить это расширение

extension UINavigationBar {
    func changeFont() {
        self.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Poppins-Medium", size: 17)!]
    }
}

Добавьте следующую строку в viewDidLoad ()

self.navigationController?.navigationBar.changeFont()
Пранит
источник
-1

Работа в Swift 3.0. Для изменения цвета заголовка необходимо добавить такие атрибуты titleTextAttributes

        let textAttributes = [NSForegroundColorAttributeName:UIColor.white]
        self.navigationController.navigationBar.titleTextAttributes = textAttributes

For changing navigationBar background color you can use this
        self.navigationController.navigationBar.barTintColor = UIColor.white

For changing navigationBar back title and back arrow color you can use this
       self.navigationController.navigationBar.tintColor = UIColor.white
Викрам
источник