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
相关产品推荐
相关产品推荐

