You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么UIButton设置自定义字体后点击会恢复系统默认字体?

问题原因

你当前只在viewDidLoad中直接修改了按钮titleLabel的字体属性,这种写法本身就不符合UIKit的规范:UIButton的titleLabel为只读属性,其文本样式会被按钮不同状态(普通、高亮、选中、禁用)的配置自动覆盖。当你点击按钮触发状态切换时,Storyboard/XIB中配置的默认系统字体会重新生效,就会出现字体复原的问题。

解决方法

你可以选择以下任意一种方案修复:

  • 方案一:修改按钮样式为自定义(最简便)
    打开你的Storyboard/XIB文件,找到loginButton的属性检查器,将顶部Style选项从System改为Custom,你原来的loginButton.titleLabel?.font配置就可以在所有状态下生效,不会被重置。
  • 方案二:通过富文本为所有状态指定字体
    不需要修改XIB配置,直接修改viewDidLoad中的字体设置代码即可:
    override func viewDidLoad() {
        super.viewDidLoad()
        // 配置统一的文本属性
        guard let customFont = UIFont(name: "Capitana-Bold", size: 16) else {
            // 兜底逻辑,避免字体加载失败崩溃
            print("自定义字体加载失败,请检查字体是否正确导入项目并配置Info.plist")
            return
        }
        let attributes: [NSAttributedString.Key: Any] = [.font: customFont]
        // 给所有需要的按钮状态设置带字体的富文本
        let normalTitle = NSAttributedString(string: loginButton.currentTitle ?? "", attributes: attributes)
        loginButton.setAttributedTitle(normalTitle, for: .normal)
        loginButton.setAttributedTitle(normalTitle, for: .highlighted)
        loginButton.setAttributedTitle(normalTitle, for: .selected)
    }
    
额外检查项

如果修改后仍不生效,请确认以下配置:

  • 自定义字体文件已经正确导入项目,且目标成员资格已经勾选
  • 已经在Info.plist中添加Fonts provided by application配置,数组中包含该字体对应的文件名(包含后缀,如Capitana-Bold.otf)
  • 字体的PostScript名称正确,你可以用以下代码打印所有可用字体名确认:
    for family in UIFont.familyNames {
        print("字体系列:\(family)")
        for name in UIFont.fontNames(forFamilyName: family) {
            print("  字体名:\(name)")
        }
    }
    

内容的提问来源于stack exchange,提问作者vrgrg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:06:00