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

更新Xcode 16与macOS 15.0.1后自定义字体无法正常显示

自定义字体在富文本中失效的问题解决

同类问题反馈

是的,已经有不少开发者在升级Xcode 16和macOS 15.0.1后遇到了这个问题——之前正常的自定义字体,在富文本里突然不显示了,大概率是新版本对字体加载的逻辑做了更严格的校验。

排查修复步骤

1. 确认字体文件的Target关联

选中项目里的自定义字体文件,查看右侧文件检查器的Target Membership,一定要勾选当前的主App Target(如果有扩展Target也得按需勾上)。Xcode 16对资源的Target绑定要求比之前严格很多,有时候升级后之前自动绑定的会失效。

2. 重新核对Info.plist的配置

打开Info.plist,检查UIAppFonts(iOS项目)或者ATSApplicationFontsPath(macOS项目):

  • 字体文件名要完全对应,包括后缀(.otf/.ttf)和大小写——Xcode 16现在对大小写匹配卡得特别死,之前能混过去的现在不行了。
  • 如果用的是ATSApplicationFontsPath,要确认路径指向的文件夹确实在项目里,而且文件夹也勾选了Target。

3. 区分字体文件名和字体名称

很多时候问题出在字体名称上,不是文件名。怎么找正确的字体名称?

  • 打开Font Book,选中你的字体,右键选「显示字体信息」,查看里面的「全名」——比如文件叫MyFont-Bold.ttf,实际字体全名可能是MyFont Bold。
  • 或者直接在代码里打印所有可用字体,定位你的目标字体:
    UIFont.familyNames.forEach { family in
        print("字体家族:\(family)")
        UIFont.fontNames(forFamilyName: family).forEach { fontName in
            print("  字体名称:\(fontName)")
        }
    }
    
    富文本里设置的字体名称必须和打印出来的完全一致,Xcode 16不再支持模糊匹配。

4. 清除缓存并重启环境

  • 删除Xcode的Derived Data:打开Xcode设置(Xcode > Settings),选择Locations,点击Derived Data旁边的箭头,删掉对应项目的缓存文件夹。
  • 重启Xcode、模拟器/真机,甚至重启Mac——新版本的系统和IDE缓存冲突很容易导致字体加载异常。

5. 手动注册字体

要是上面的步骤都没用,那就绕过系统自动加载逻辑,手动注册字体:

func registerCustomFont() {
    guard let fontURL = Bundle.main.url(forResource: "MyFont-Regular", withExtension: "ttf"),
          let dataProvider = CGDataProvider(url: fontURL as CFURL),
          let cgFont = CGFont(dataProvider) else {
        print("找不到字体文件")
        return
    }
    
    var error: Unmanaged<CFError>?
    if CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        print("字体注册成功")
    } else {
        print("注册失败:\(error?.takeRetainedValue() ?? "未知错误")")
    }
}

在App启动时调用这个方法,之后再设置富文本的字体。

6. 检查系统字体权限

前往系统设置 > 隐私与安全性 > 字体,确认你的App被允许访问字体。macOS 15.0.1加强了字体权限管理,可能默认阻止了App加载自定义字体。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:00:14