使用 Kotlin 多平台的 iOS 应用程序中不显示自定义字体

问题描述 投票:0回答:1

我正在开发一个 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 应用程序未正确加载自定义字体。

fonts compose-multiplatform compose-multiplatform-ios
1个回答
0
投票

像这样从 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")))
© www.soinside.com 2019 - 2024. All rights reserved.