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

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

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

person aZtraL-EnForceR    schedule 05.11.2013    source источник


Ответы (18)


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

[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)!]
person Brian    schedule 22.02.2014
comment
Размер остается неизменным независимо от того, какое значение я пробую. - person Raphael Royer-Rivard; 16.07.2015
comment
Да, я понял, что мой шрифт неправильно загружен. До сих пор не могу понять, почему, я импортировал OpenSans-Light и OpenSans-Regular таким же образом, только OpenSans-Light, похоже, можно использовать ... - person Raphael Royer-Rivard; 17.07.2015
comment
В коде Obj-C отсутствует закрывающая скобка. Это должно быть: [self.navigationController.navigationBar setTitleTextAttributes: @ {NSForegroundColorAttributeName: [UIColor redColor], NSFontAttributeName: [UIFont fontWithName: @ mplus-1c-обычный размер: 21]}]; - person Dylan Hand; 01.12.2015
comment
перейдите по ссылке для изменения шрифта backBarButton: stackoverflow.com/a/16538596/5967144 - person soorej babu; 03.06.2018
comment
А как насчет использования LargeTitle NavBar? Я не нахожу ничего navigationBar.LargeTitleTextAttributes или ничего в этом отношении. Вы знаете, как установить глобальный шрифт LargeTitle? - person iKK; 17.10.2019

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

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

navbar

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

title-font

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

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

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

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

размер

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

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

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

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

Результат

navbar-italic

Образцы

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

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

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

  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
person Tommie C.    schedule 17.11.2015

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

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor whiteColor],NSForegroundColorAttributeName,
                                [UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;
person Akki    schedule 05.11.2013

Мой код 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)
person Libor Zapletal    schedule 10.04.2015

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

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont(name: "YOUR FONT NAME", size: 25.0)!]
person Renish Dadhaniya    schedule 14.11.2018

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

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

  -(void)viewDidAppear:(BOOL)animated{}
person Praveen Hiremath    schedule 25.10.2017

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

self.navigationController?.navigationBar.titleTextAttributes =
        [NSForegroundColorAttributeName: UIColor.red,
         NSFontAttributeName: UIFont(name: "{your-font-name}", size: 21)!]
person Karl Taylor    schedule 28.09.2016

Это немного удобнее читать с помощью литералов:

self.navigationController.navigationBar.titleTextAttributes = @{
                                                              NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21],
                                                              NSForegroundColorAttributeName: [UIColor whiteColor]
                                                              };
person sPoz    schedule 12.07.2015

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

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

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

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

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

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

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

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

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

person O. Boujaouane    schedule 11.05.2017

Быстрый:-

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Love Nature", size: 40)!]
person karthik    schedule 26.07.2018

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

let titleTextAttributed: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.red, .font: UIFont(name: "AvenirNext-Regular", size: 20) as Any]
navigationController?.navigationBar.titleTextAttributes = titleTextAttributed
person Hendra Kusumah    schedule 11.03.2018

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
}
person Vivek    schedule 03.04.2018

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

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

}
person Hardik Thakkar    schedule 11.09.2018

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

    let textAttributes:[String:Any]? = [NSAttributedStringKey.foregroundColor.rawValue:UIColor.blue, NSAttributedStringKey.font.rawValue:UIFont(name:"Avenir Next", size:20)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
person Josh    schedule 19.07.2017

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

    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
person James Rochabrun    schedule 04.04.2018

Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
        [NSAttributedString.Key.foregroundColor: UIColor.white,
         NSAttributedString.Key.font: UIFont(name: "LemonMilklight", size: 21)!]
person ilkayaktas    schedule 15.11.2018

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

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

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

self.navigationController?.navigationBar.changeFont()
person Pranit    schedule 20.06.2019

Работа в 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
person vikram    schedule 03.06.2017