gpt4 book ai didi

ios11 - 在 UIBarButtonItem 上调用 setTitleTextAttributes 对 iOS 11 没有任何影响

转载 作者:行者123 更新时间:2023-12-02 06:42:01 25 4
gpt4 key购买 nike

我在 didFinishLaunchingWithOptions 中使用外观代理来设置整个项目的 UIBarButtonItem 标题字体,如下所示:

UIBarButtonItem.appearance().setTitleTextAttributes([
NSAttributedStringKey.font: customFont
]
, for: .normal)

我想做的是根据用户选择更改此字体?因此,当用户选择字体时,我将其存储在 UserDefaults 中,并向那些我知道有 UIBarButtonItems 的 View Controller 发送本地通知,然后直接重置每个字体,如下所示:

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 中它不会对左、右或后栏按钮项目产生立即影响。

如果弹出 View Controller 然后再次推送到导航堆栈,则后栏按钮项目将调整为新字体 - 栏按钮项目在下一次应用程序运行之前不会更改。

我自然会对导航栏标题做同样的事情,所以在 AppDelegate 中:

UINavigationBar.appearance().titleTextAttributes = [
NSAttributedStringKey.font: ...
]
if #available(iOS 11.0, *) {
UINavigationBar.appearance().largeTitleTextAttributes = [
NSAttributedStringKey.font : ...
]
}

在每个 View Controller 中,我再次重置这些值,标题会立即更改字体。

我尝试在每个控件状态下将栏按钮项标题文本属性设置为新字体,即:[.normal, .highlighted, .disabled],但没有成功。

我还尝试将 navigationItem.leftBarButtonItem 设置为 UIBarButonItem 的新实例,希望它具有新字体,但按钮完全消失:D

我尝试的最后一件事是在导航栏上调用 setNeedsDisplaylayoutIfNeeded 但仍然没有任何反应。

案例示例项目见 here

最佳答案

这是一个 super 黑客机制,可以解决看似明显的错误(或未记录的优化):

    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% 有效,因为快速点击“更改字体”不会被注册。但也许你可以解决这个问题?

关于ios11 - 在 UIBarButtonItem 上调用 setTitleTextAttributes 对 iOS 11 没有任何影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50132641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com