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

Kotlin Multiplatform项目iOS端自定义字体不显示问题

KMM自定义字体iOS端不加载问题解决

问题原因

iOS端未正确配置字体资源,导致Typeface.makeFromName无法找到目标字体,系统自动回退到默认的Helvetica字体。


解决步骤

1. 正确配置iOS项目中的字体文件

  • 将自定义字体文件(如knight.ttf)复制到iOS应用的Resources目录下(建议创建Fonts子目录统一管理)
  • 在Xcode中选中字体文件,确保Target Membership已勾选当前iOS应用目标(否则字体不会被打包到应用中)
  • 打开Info.plist,添加Fonts provided by application(对应键名UIAppFonts)数组项,将字体的完整文件名(如knight.ttf)添加到数组里

2. 修正iOS端字体加载代码

iOS加载字体需要使用字体的PostScript名称(不是文件名),你可以通过两种方式获取:

  • 用Mac自带的Font Book打开字体文件,查看PostScript名称(在字体信息面板中)
  • 临时在iosMain中添加代码打印所有可用字体,找到目标字体的名称:
UIFont.familyNames.forEach { familyName ->
    UIFont.fontNames(forFamilyName = familyName).forEach { fontName ->
        println("可用字体: $fontName")
    }
}

修改iosMain/CustomFonts.kt代码,替换为正确的PostScript名称:

private fun loadCustomFont(postScriptName: String): Typeface {
    return Typeface.makeFromName(postScriptName, FontStyle.NORMAL)
}

actual val knightFontFamily
    get() = FontFamily(Typeface(loadCustomFont("Knight-Regular"))) // 替换为你的字体PostScript名称

如果上述方式仍有问题,可直接从文件加载字体(更可靠):

actual val knightFontFamily: FontFamily
    get() {
        val fontFileName = "knight"
        val fontExtension = "ttf"
        val fontPath = NSBundle.mainBundle.pathForResource(fontFileName, fontExtension) 
            ?: error("找不到字体文件: $fontFileName.$fontExtension")
        
        val fontData = NSData.dataWithContentsOfFile(fontPath)
        val provider = CGDataProviderCreateWithCFData(fontData)
        val cgFont = CGFontCreateWithDataProvider(provider)
        
        return FontFamily(Typeface(cgFont))
    }

3. 验证加载结果

运行iOS应用后,重新打印字体信息,如果输出的familyName为你的自定义字体名称,说明加载成功。


内容的提问来源于stack exchange,提问作者Bedirhan Dağ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:16:09