如何在Xcode SwiftUI预览中显示自定义字体?
SwiftUI预览中自定义字体不生效的原因及解决方法
原因
SwiftUI预览的运行进程与正式App的运行环境存在差异:正式App启动时会自动读取Info.plist中UIAppFonts配置并注册字体,但预览进程不会自动执行这一流程,导致自定义字体未被系统字体库识别,最终Font.custom()只能 fallback 到系统字体。
解决方法
1. 确认字体名称的准确性
很多时候问题出在字体文件名≠字体内部的PostScript名称:
- 用macOS「字体册」打开你的自定义字体文件
- 右键选择「显示字体信息」,查看「PostScript名称」
- 确保
Font.custom()中传入的是这个PostScript名称,而非文件名
2. 在预览代码中手动注册字体
直接在预览提供者中添加字体注册逻辑,强制加载字体文件:
struct ContentView_Previews: PreviewProvider { static var previews: some View { registerCustomFont() return ContentView() } static private 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>? CTFontManagerRegisterGraphicsFont(cgFont, &error) if let error = error?.takeRetainedValue() { print("字体注册失败: \(error.localizedDescription)") } } }
注意替换代码中的"MyFont-Regular"和"ttf"为你的字体文件名和后缀。
3. 清理缓存并重启Xcode
Xcode的缓存可能导致预览资源加载异常:
- 执行菜单
Product > Clean Build Folder(快捷键⇧⌘K) - 完全退出Xcode后重新打开,再尝试预览
4. 检查字体文件的Target Membership
确保字体文件被正确关联到预览进程能访问的Target:
- 在项目导航栏中选中字体文件
- 打开右侧「检查器」面板,确认「Target Membership」中勾选了当前App的主Target
内容的提问来源于stack exchange,提问作者Dan Fabulich
相关产品推荐
相关产品推荐

