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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:40:58