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

SwiftUI Text切换自定义与系统字号及获取Font.body对应数值方法

问题解答

1. 原有写法是否可行

你提供的代码无法正常编译,原因是.system(size:)要求传入CGFloat类型的数值参数,而Font.body是Font类型,二者类型不匹配,直接赋值会触发类型错误。

2. 获取Font.body对应实际字号的方法

可以借助UIKit的UIFont接口获取对应文本样式的实际字号,代码如下:

// 获取当前动态字体设置下,body样式对应的实际字号
let bodyPointSize = UIFont.preferredFont(forTextStyle: .body).pointSize

注意:该数值会跟随系统的动态字体大小设置自动变化,如果需要适配动态类型,不要缓存该值,建议在使用时实时获取
默认状态下(系统动态字体为标准大小),iOS平台的Font.body对应的字号为17pt。

3. 自定义字号与系统预设字号切换的实现

提供两种常用实现方案:

  • 方案1:直接切换Font实例,无需单独获取字号
    该方案可以完整保留系统预设字体的动态类型适配、默认字重等特性,推荐优先使用:
Text(text)
    .font(textSize != nil ? .system(size: textSize!) : .body)

用可选绑定写法安全性更高:

if let textSize = textSize {
    Text(text)
        .font(.system(size: textSize))
} else {
    Text(text)
        .font(.body)
}
  • 方案2:统一走system(size:)设置,兜底用系统body字号
    如果你的业务逻辑需要统一传入数值类型的字号参数,可以用系统body的字号作为兜底值:
let finalFontSize = textSize ?? UIFont.preferredFont(forTextStyle: .body).pointSize
Text(text)
    .font(.system(size: finalFontSize))

如果要适配动态类型,可将字号计算逻辑放在视图body内部,系统动态字体修改时会自动触发视图重绘更新字号。


内容的提问来源于stack exchange,提问作者Big_Chair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:45:03