我正在开发一个 Kotlin 多平台项目,尝试为 Android 和 iOS 实现自定义字体。自定义字体在 Android 应用程序中可以正常工作,但不会出现在 iOS 应用程序中。以下是相关代码片段:
自定义字体.kt(iosMain)
private fun loadCustomFont(name: String): Typeface {
return Typeface.makeFromName(name, FontStyle.NORMAL)
}
actual val knightFontFamily
get() = FontFamily(Typeface(loadCustomFont("knight")))
自定义字体.kt(commonMain)
expect val knightFontFamily: FontFamily
自定义字体.kt(androidMain)
actual val knightFontFamily = FontFamily(
Font(R.font.knight)
)
自定义主题.kt(commonMain)
val typography = Typography(
subtitle1 = TextStyle(
fontFamily = knightFontFamily, // Custom Font
fontWeight = FontWeight.Normal,
fontSize = 24.sp
)
)
@Composable
fun AppTheme(
content: @Composable () -> Unit
) {
MaterialTheme(
typography = typography,
content = content
)
}
App.kt 类
fun App(client: SendRequest) {
AppTheme {
var newData by remember { mutableStateOf(listOf<DataResponseModel>()) }
var siteNames2 by remember { mutableStateOf(listOf<String?>()) }
val scope = rememberCoroutineScope()
// ...
}
}
使用字体 我在用户界面中使用自定义字体,如下所示:
Text(
style = TextStyle(
fontFamily = knightFontFamily
),
text = "${serverName?.uppercase()}",
color = Color.White,
modifier = Modifier.padding(vertical = 8.dp, horizontal = 4.dp)
.wrapContentSize(Alignment.Center),
fontSize = 24.sp
)
问题 自定义字体在 Android 应用程序中有效,但在 iOS 应用程序中不显示。当我从 iosMain 将字体记录到 CustomFonts.kt 中时:
println("Font -> ${Typeface.makeFromName(name, FontStyle.NORMAL)}")
调试器输出为:
字体 -> 字体(familyName='Helvetica', fontStyle=FontStyle(weight=400, width=5, slant=UPRIGHT), uniqueId=1) 这表明 iOS 应用程序未正确加载自定义字体。
问题 自定义字体在 Android 应用程序中有效,但在 iOS 应用程序中不显示。当我从 iosMain 将字体记录到 CustomFonts.kt 中时:
println("Font -> ${Typeface.makeFromName(name, FontStyle.NORMAL)}")
调试器输出为:
Font -> Typeface(familyName='Helvetica', fontStyle=FontStyle(weight=400, width=5, slant=UPRIGHT), uniqueId=1)
这表明 iOS 应用程序未正确加载自定义字体。
像这样从 iosMain CustomTheme.kt 类修复 ->
@OptIn(InternalResourceApi::class)
private fun loadCustomFont(name: String): Typeface {
val typeFace =
runBlocking {
return@runBlocking Typeface.makeFromData(
Data.makeFromBytes(
readResourceBytes("font/$name.ttf")
), 0
)
}
return typeFace
}
actual val knightFontFamily
get() = FontFamily(Typeface(loadCustomFont("knight")))