SwiftUI macOS自定义字体失效问题求助
在macOS SwiftUI中解决自定义字体失效的问题
核心问题原因
iOS的SwiftUI依赖UIFont加载字体,对名称匹配逻辑较宽松,能识别字体的显示名称;但macOS底层使用NSFont,必须传入字体的PostScript名称才能正确加载,这是字体失效的核心原因。同时要确保macOS端的Bundle配置和字体文件引用完全正确。
解决方案步骤
1. 获取字体的PostScript名称
打开Mac的「字体册」,找到目标字体后右键选择「显示字体信息」,查看「PostScript名称」字段——这才是macOS下Font.custom()需要传入的准确名称。比如部分字体显示名称为Lobster Two,但PostScript名称可能是LobsterTwo-Regular。
2. 检查macOS的Bundle配置
- 确认字体文件已添加到macOS目标的「Copy Bundle Resources」中(在Xcode项目设置→目标→Build Phases路径下查看)。
- 在macOS目标的
Info.plist中,添加ATSApplicationFontsPath(显示名称为「Application fonts resource path」),值设为./(若字体直接放在Bundle根目录),或字体所在的相对文件夹路径。
3. 跨平台适配代码(可选)
如果需要同时兼容iOS和macOS,可封装一个扩展统一处理字体调用:
import SwiftUI extension Font { static func custom(_ postScriptName: String, size: CGFloat) -> Font { // 直接使用PostScript名称,两端均兼容 return Font.custom(postScriptName, size: size) } }
4. 手动注册字体(极端情况备用)
若上述方法仍不生效,可在App启动时手动注册字体:
import SwiftUI import AppKit @main struct YourApp: App { init() { registerCustomFont(named: "SourceCodePro-ExtraLight", extension: "otf") registerCustomFont(named: "LobsterTwo-Regular", extension: "ttf") } private func registerCustomFont(named name: String, extension ext: String) { guard let fontURL = Bundle.main.url(forResource: name, withExtension: ext), let dataProvider = CGDataProvider(url: fontURL as CFURL), let cgFont = CGFont(dataProvider) else { print("Failed to load font: \(name)") return } let errorRef = UnsafeMutablePointer<Unmanaged<CFError>?>.allocate(capacity: 1) if CTFontManagerRegisterGraphicsFont(cgFont, errorRef) == false { if let error = errorRef.pointee?.takeRetainedValue() { print("Font registration error: \(error.localizedDescription)") } } errorRef.deallocate() } var body: some Scene { WindowGroup { ContentView() } } }
验证修改
替换原代码中的字体名称为获取到的PostScript名称,示例:
Text("Hello, world!") .font(Font.custom("SourceCodePro-ExtraLight", size: 40)) Text("Hello, world!") .font(Font.custom("LobsterTwo-Regular", size: 40))
内容的提问来源于stack exchange,提问作者Mane Manero
相关产品推荐
相关产品推荐

