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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:25:29