Ios 如何在Swift中更改UIBarbuttonite字体?

Ios 如何在Swift中更改UIBarbuttonite字体?,ios,swift,uibarbuttonitem,Ios,Swift,Uibarbuttonitem,我通常是一个耐心的调试器,花很多时间在谷歌上搜索问题的答案。然而,我的耐心已经耗尽,我开始相信这根本不可能 然而,我正在使用导航栏开发一个iOS应用程序,并选择在整个用户界面中使用“Optima”字体。我可以更改导航栏标题的字体,也可以在初始视图中更改自定义导航栏按钮。但是,在任何后续视图中,“我的后退”按钮上的字体是系统的默认字体。就我的一生而言,我找不到改变这一切的方法 我尝试过搜索中出现的所有东西,最接近我的成功是来自 下面的代码对我来说很有用,但将“后退”按钮更改为图像当然不是我希望的那

我通常是一个耐心的调试器,花很多时间在谷歌上搜索问题的答案。然而,我的耐心已经耗尽,我开始相信这根本不可能

然而,我正在使用导航栏开发一个iOS应用程序,并选择在整个用户界面中使用“Optima”字体。我可以更改导航栏标题的字体,也可以在初始视图中更改自定义导航栏按钮。但是,在任何后续视图中,“我的后退”按钮上的字体是系统的默认字体。就我的一生而言,我找不到改变这一切的方法

我尝试过搜索中出现的所有东西,最接近我的成功是来自

下面的代码对我来说很有用,但将“后退”按钮更改为图像当然不是我希望的那样更改字体

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "Tab_Trophy")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "Tab_Trophy")
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
(顺便说一下,上面的代码在view my back按钮的viewDidLoad()中,该按钮会将用户发送到)

无论如何,我也尝试过在不同的地方使用下面的setTitleTextAttributes,但是没有用

setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Optima", size: 19.0)!], forState: .Normal)

所以我的问题是:这能做到吗?或者我应该用我想要的字体制作一个带有文本的图像,并使用上面的代码吗?

您可以更改应用程序的所有
UIBarButtonItem
标签的字体。您可以这样做:

UINavigationBar.appearance().titleTextAttributes = [
    NSFontAttributeName: UIFont(name: "Optima", size: 19.0)!
]
或者,如果您只想自定义单个标签,则可以使用具有以下内容的自定义按钮:

let button = UIButton()
// Customise button as required
let barButtonItem = UIBarButtonItem(customView: button)

以下代码将更改顶部“导航栏”和底部“工具栏”项目的字体(UINavigationBar.appearance()。titleTextAttributes仅更改导航栏)

注:

  • 它使用以下方式设置导航栏字体:

    navigationController.navigationBar.titleTextAttributes

  • 它通过循环遍历每个工具栏项并使用以下命令来设置工具栏项:

    toolbarItem.setTitleTextAttributes

  • 它在ViewDidLayoutSubView中运行,因此添加到情节提要工具栏中的项目也将受到影响。如果您以编程方式执行所有操作,则可以将其放置在viewDidLoad或ViewWillDisplay中
  • boolean firstShow只是为了防止每次用户旋转设备时都运行此代码。不完全是必需的(如果将代码移动到viewDidLoad/viewwillbeforeived,则不需要),但效率更高一些
  • 字体的展开可能看起来有点迂腐,但如果苹果在未来版本的iOS中撤回你的命名字体,应用程序将崩溃
  • 它没有为按钮栏项目指定颜色(这样做会弄乱它们的突出显示/未突出显示的颜色)-而是使用默认的应用程序色调(例如在故事板中)来指定它们的颜色
  • 它确实为导航栏指定了一种颜色(导航栏标题的应用程序色调被忽略,但它不受其按钮中突出显示/未突出显示问题的影响)
  • 更改“AmericanTypewriter”的颜色,并根据需要添加其他属性
  • 分享和享受

    var firstShow = false
    
    override func viewDidLayoutSubviews() {
    
        super.viewDidLayoutSubviews()
    
        if firstShow {
    
            let navbarAttributes:[String:Any]
            let toolbarAttributes:[String:Any]
            if let font = UIFont(name: "AmericanTypewriter", size: 22.0) {
                navbarAttributes = [
                    NSFontAttributeName: font,
                    NSForegroundColorAttributeName : UIColor.init(red:1.0, green:0, blue:0, alpha:1.0)
                ]
                toolbarAttributes = [
                    NSFontAttributeName: font
                ]
            }
            else {
                navbarAttributes = [
                    NSForegroundColorAttributeName : UIColor.init(red:1.0, green:0, blue:0, alpha:1.0)
                ]
                toolbarAttributes = [:]
            }
            navigationController?.navigationBar.titleTextAttributes = navbarAttributes
    
            if let toolbarItems = navigationController?.toolbar.items {
                for toolbarItem in toolbarItems {
                    toolbarItem.setTitleTextAttributes(toolbarAttributes, for: .normal)
                    toolbarItem.setTitleTextAttributes(toolbarAttributes, for: .disabled)
                }
            }
    
            firstShow = false
        }
    }
    

我已经尝试了您的两种建议,但应用程序仍然坚持使用系统字体。我可能做错了什么,或者我的故事板或代码的另一部分把事情搞砸了。我现在只接受系统字体,但如果我偶然发现一个解决方案,我会发布。听起来你正在做的任何事情都被其他东西覆盖了,你需要先修复它,然后才能做任何事情。OP要求更改按钮栏项。UINavigationBar.appearance().titleTextAttributes仅更改导航栏项。请参阅我贴出的答案,以获取其他答案。