Как изменить шрифт кнопки "Назад" для моей панели навигации?
Как изменить шрифт кнопки "Назад" для моей панели навигации.
Кнопка "Назад" либо "назад", либо заголовок с предыдущего контроллера представлений.
Я думал, что это viewDidLoad
будет работать:
navigationController?.navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: UIControlState.Normal)
но необязательный leftBarButton?
возвращает nil
.
Ответы
Ответ 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