Подтвердить что ты не робот

Как изменить шрифт кнопки "Назад" для моей панели навигации?

Как изменить шрифт кнопки "Назад" для моей панели навигации.

Кнопка "Назад" либо "назад", либо заголовок с предыдущего контроллера представлений.

Я думал, что это viewDidLoad будет работать:

navigationController?.navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: UIControlState.Normal)

но необязательный leftBarButton? возвращает nil.

4b9b3361

Ответ 1

Просто проверил ваш код, и, похоже, причина, по которой возвращается строка nil, на самом деле потому, что name: "FONTNAME" возвращает nil. Поэтому, если вы установите для этого атрибута name допустимое имя шрифта, код должен работать без ошибки - даже если navigationController?.navigationItem.leftBarButtonItem явно установлен на nil.

Но независимо от того, как я видел через тестирование, эта строка не даст вам результат, который вы, по-видимому, хотите. Ведущий navigationController необязательный не должен быть там, так как он обращается к вашему UINavigationController, а не к текущему виду. Просто используйте свойство UIViewController own navigationItem для прямого доступа к его leftBarButtonItem, например:

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
navigationItem.leftBarButtonItem = backButton
navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)

Изменить. Из комментария, опубликованного в этом ответе, кажется, что вы действительно не хотите устанавливать leftBarButtonItem, но backBarButtonItem, потому что вы не хотите реализовывать настраиваемое действие, за исключением возврата к предыдущему контроллеру представления.

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

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
backButton.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)
navigationItem.backBarButtonItem = backButton

Ответ 2

Если вам нужно полностью изменить стиль шрифта entirely во всем приложении (то есть, для каждой кнопки навигации), предпочтительным методом является использование прокси-сервера UIBarButtonItem.appearance().

Пример кода может выглядеть следующим образом:

SWIFT 3. 0+

//make sure font name u use below *actually* exists in the system !
//if it does not app will crash because we're force unwrapping an optional (see below) !!!
let customFont = UIFont(name: "customFontName", size: 17.0)!
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], for: .normal)

Целесообразно поместить этот фрагмент кода где-нибудь в начале вашего файла AppDelegate.swift, потому что стилизация шрифта должна происходить каждый раз при запуске приложения. Кроме того, вы можете поместить этот код в любое другое место (например, класс Presenter), где вы выполняете стилизацию и настройку вашего пользовательского интерфейса. Как только этот код будет выполнен, все ваши кнопки BarButton будут настроены после этого.


НО как настоящий Swift 🤓, сначала вы должны по желанию развернуть свой шрифт и в конечном итоге использовать системный шрифт, если он не найден или возникла какая-либо другая возможная проблема во время загрузки шрифта.

var textAttributes: [String:Any]

//custom font setup
let fontColor = UIColor.purple
let barItemCustomFont = UIFont(name: "👑", size: 14)  //note we're not forcing anything here

//can we use our custom font 🤔
if let customFont = barItemCustomFont {
    //hooray we can use our font 💪
    textAttributes = [NSForegroundColorAttributeName: fontColor, NSFontAttributeName: customFont]
} else {
    //👎 not found -> omit setting font name and proceed with system font
    textAttributes = [NSForegroundColorAttributeName: fontColor]
}

//finally
UIBarButtonItem.appearance().setTitleTextAttributes(textAttributes, for: .normal)

Пример из реального мира

В реальном приложении обычно требуется настроить стиль шрифта UINavigationBar и UIBarButton (помимо других параметров), чтобы сделать их визуально согласованными. Вот удобная функция stylizeNavigationFontOfMyAmazingApp🎨, которую вы можете использовать:

func stylizeNavigationFontOfMyAmazingApp🎨() {
    //custom font
    let customFont = UIFont(name: "someFancyFont", size: 16)!  //note we're force unwrapping here

    //navigation bar coloring:
    UINavigationBar.appearance().tintColor = UIColor.white
    UINavigationBar.appearance().barTintColor = UIColor.blue

    //unique text style:
    var fontAttributes: [String: Any]
    fontAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: customFont]

    //navigation bar & navigation buttons font style:
    UINavigationBar.appearance().titleTextAttributes = fontAttributes
    UIBarButtonItem.appearance().setTitleTextAttributes(fontAttributes, for: .normal)

}


Преимущества использования прокси-сервера appearance()

  • Фрагмент кода из двух строк для стилизации каждого UIBarButtonItem в ваше приложение/проект.
  • Вы можете смешивать прокси appearance() нескольких классов, чтобы получить действительно уникальный визуальный стиль
  • Если вам нужно дополнительное управление настройкой, вы можете перенастроить каждую кнопку дальше (например, разместить пользовательские виды, кнопки, изображения и т.д.) - для конкретного экземпляра UIBarButtonItem.

Ссылка

Apple Docs по протоколу appearance.

Ответ 3

Если вы хотите применить это изменение ко всем своим приложениям, вы можете использовать ниже код:

Swift 4

Я добавил эти строки в AppDelegate.swift в application:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       UINavigationBar.appearance().titleTextAttributes = [
            NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 20)!
        ]

        UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)

  return true
}

Swift 3

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    UINavigationBar.appearance().titleTextAttributes = [
        NSFontAttributeName: UIFont(name: "IranSansMobile", size: 20)!
    ]

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)


    return true
}

Ответ 4

Когда вы уверены, что вы уже установили UIBarButtonItem, вы можете сделать:

self.navigationItem.leftBarButtonItem!.title = "myTitle"

Чтобы изменить, например, цвет вы можете сделать следующее:

self.navigationItem.leftBarButtonItem!.tintColor = UIColor.redColor()

Если вы не установили его в своем раскадровке, вы можете сделать:

self.navigationItem.leftBarButtonItem = UIBarButtonItem()

Для изменения шрифта выполните следующие действия:

self.navigationItem.leftBarButtonItem!.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: .Normal)

Возможно, я должен упомянуть, что вы не должны использовать self. navigationController, потому что при настройке кнопок navigationController они не отображаются на экране, поэтому в результате кнопки, которые находятся на экране и были установлены в раскадровке должны быть self.navigationItem...

Ответ 5

SWIFT 3

    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!,NSForegroundColorAttributeName: UIColor.white]
    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!], for: UIControlState.normal)

Ответ 6

Для iOS 13, Swift 5.1:

let fontAttr = [NSAttributedString.Key.font: \*your font*\]

let buttonAppearance = UIBarButtonItemAppearance()
buttonAppearance.normal.titleTextAttributes = fontAttr

let navbarAppearance = UINavigationBarAppearance()
navbarAppearance.buttonAppearance = buttonAppearance
UINavigationBar.appearance().standardAppearance = navbarAppearance