Вызов setTitleTextAttributes для UIBarButtonItem не оказывает никакого влияния на iOS 11 - PullRequest
0 голосов
/ 02 мая 2018

Я использую прокси внешнего вида в 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 на панели навигации, но все равно ничего не происходит.

Пример проекта можно найти здесь

1 Ответ

0 голосов
/ 11 мая 2018

Вот супер хакерский механизм для обхода очевидной ошибки (или недокументированной оптимизации):

    for controlState in [UIControlState.disabled, .highlighted, .normal] {

        self.changeBarButtonFont(barButtonItem: self.updateButton, font: font, controlState: controlState)

        self.changeBarButtonFont(barButtonItem: self.selectButton, font: font, controlState: controlState)
    }


private func changeBarButtonFont(barButtonItem: UIBarButtonItem, font: UIFont, controlState: UIControlState) {
    barButtonItem.title = barButtonItem.title! + " "

    barButtonItem.setTitleTextAttributes([NSAttributedStringKey.font : font], for: controlState)

    DispatchQueue.main.async
    {
        barButtonItem.title = barButtonItem.title?.trimmingCharacters(in: CharacterSet.whitespaces)
    }
}

Обратите внимание, что это не работает на 100%, поскольку быстрые нажатия на «Изменить шрифт» не будут регистрироваться. Но, возможно, вы могли бы решить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...