为什么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
相关产品推荐
相关产品推荐

