如何通过CTFontCreateWithName在Core Text中使用iOS默认系统字体?
针对Core Text使用SF Pro字体的问题解答
1. 动态匹配系统字体切换逻辑
SF Pro Text和Display的字体名是固定的,比如常规字重对应SFProText-Regular和SFProDisplay-Regular,你可以直接根据字体尺寸判断切换:
let fontSize: CGFloat = 18 let fontName = fontSize < 20 ? "SFProText-Regular" : "SFProDisplay-Regular" let fontRef = CTFontCreateWithName(fontName as CFString, fontSize, nil)
如果需要其他字重(如Medium、Bold),替换后缀即可,比如SFProText-Medium、SFProDisplay-Bold。
但更推荐借助UIFont的系统API来间接获取CTFont,因为UIFont会自动遵循iOS的字体切换规则,不用自己硬编码判断,还能兼容不同版本的字体命名变化:
let fontSize: CGFloat = 18 // UIFont会自动根据尺寸选择Text/Display系列 let uiFont = UIFont.systemFont(ofSize: fontSize, weight: .regular) // 直接将UIFont转为CTFont let fontRef = uiFont as CTFont
2. 是否需要动态切换字体?
必须动态切换,这是苹果官方的设计规范:
- SF Pro Text针对小字号阅读优化,字间距和笔画细节更适合长文本;
- SF Pro Display针对大字号标题优化,视觉更醒目,放大后笔画更舒展。
统一用一种字体会破坏系统排版的一致性,比如小字号用Display会显得拥挤,大字号用Text会缺乏视觉冲击力。
3. Core Text使用系统字体的最佳实践
- 优先通过
UIFont转CTFont:避免硬编码字体名带来的版本兼容问题,苹果可能在不同iOS版本调整字体内部命名; - 保持字重一致:Text和Display系列使用相同的字重(如都是Regular或Semibold),确保排版风格统一;
- 适配动态类型:如果支持动态类型,使用
UIFont.preferredFont(forTextStyle:)获取字体,它会自动匹配对应文本样式的字体变体和尺寸; - 测试多版本iOS:SF Pro是iOS 13及以上的默认字体,旧版本系统可能使用不同字体,确保你的逻辑在目标版本正常工作;
- 避免冲突:不要在项目中添加与系统字体同名的自定义字体,否则会覆盖系统字体,导致排版异常。
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

