Я использую прокси внешнего вида в didFinishLaunchingWithOptions
, чтобы установить UIBarButtonItem
шрифт заголовка для проекта следующим образом:
UIBarButtonItem.appearance().setTitleTextAttributes([
NSAttributedStringKey.font: customFont
]
, for: .normal)
Что я хотел бы сделать, это изменить этот шрифт в зависимости от выбора пользователя?
Поэтому, когда пользователь выбирает шрифт, я сохраняю его в UserDefaults
и отправляю локальное уведомление для тех контроллеров представления, которые, как я знаю, имеют UIBarButtonItems
, и я сбрасываю каждый из них следующим образом:
navigationItem.leftBarButtonItems?.forEach { $0.setTitleTextAttributes([NSAttributedStringKey.font: ...], for: .normal) }
navigationItem.rightBarButtonItems?.forEach { $0.setTitleTextAttributes([NSAttributedStringKey.font: ...], for: .normal) }
navigationItem.backBarButtonItem?.setTitleTextAttributes([NSAttributedStringKey.font: customFont], for: .normal)
Это работает, как и ожидалось, в iOS 10, но в iOS 11 не оказывает непосредственного влияния ни на элементы кнопок левой, правой или задней панели.
Элемент кнопки задней панели настраивается на новый шрифт, если контроллер представления извлечен, а затем снова помещен в стек навигации - элементы кнопки панели не изменяются до следующего запуска приложения.
Естественно, я делаю то же самое с заголовком панели навигации, поэтому в AppDelegate:
UINavigationBar.appearance().titleTextAttributes = [
NSAttributedStringKey.font: ...
]
if #available(iOS 11.0, *) {
UINavigationBar.appearance().largeTitleTextAttributes = [
NSAttributedStringKey.font : ...
]
}
И в каждом контроллере представления я сбрасываю эти значения снова, и заголовки мгновенно меняют шрифт.
Я пытался установить атрибуты текста заголовка элементов панели кнопок на новый шрифт в каждом состоянии элемента управления, а именно: [.normal, .highlighted, .disabled]
безуспешно.
Я также попытался установить для navigationItem.leftBarButtonItem
новый экземпляр UIBarButonItem
, надеясь, что у него будет новый шрифт, но кнопка полностью исчезнет: D
Последнее, что я пытался сделать, - это вызвать setNeedsDisplay
и layoutIfNeeded
на панели навигации, но все равно ничего не происходит.
Пример проекта можно найти здесь