You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS13.1中请求大字号San Francisco字体返回Times New Roman变体问题

这不是iOS的Bug,而是UIFont初始化方法的特性差异

你遇到的这个情况其实是系统字体的命名机制UIFont(name:size:)方法的行为导致的,完全不是iOS的bug,咱们来拆解一下:

为什么UIFont(name:size:)会返回Times New Roman?

San Francisco作为iOS的系统默认字体,它的内部字体名称(比如.SFUI-Regular)属于系统私有注册的标识,并不是公开的、可以直接通过UIFont(name:)检索到的字体名称。当你用这个私有名称去调用UIFont(name:size:)时,系统找不到匹配的公开注册字体,就会自动回退到默认的 fallback 字体——也就是你看到的TimesNewRomanPSMT。

为什么withSize(_:)能正常得到San Francisco?

withSize(_:)UIFont的实例方法,它的逻辑是基于已有的字体实例直接调整字号,不会去重新查找系统中的字体注册项。它会完整保留原字体的所有特性(包括系统字体的私有变体信息),所以自然能得到正确的大字号San Francisco字体。

正确的系统字体调整姿势

如果你需要调整系统字体的字号,推荐两种可靠的方式:

  • 直接使用已有字体实例的withSize(_:)方法(就是你已经验证有效的方式)
  • 用系统提供的UIFont.systemFont(ofSize:weight:)系列方法,明确指定字号和字体权重:
let l = UILabel()
let originalFont = l.font!

// 方式1:基于原字体调整字号
let largerFont1 = originalFont.withSize(originalFont.pointSize + 8)
NSLog("\(largerFont1.fontName)") // 输出 .SFUI-Regular

// 方式2:直接创建指定字号的系统字体
let largerFont2 = UIFont.systemFont(ofSize: originalFont.pointSize + 8, weight: .regular)
NSLog("\(largerFont2.fontName)") // 同样输出正确的系统字体名称

简单来说,系统字体有它特殊的管理逻辑,避开直接用私有名称去初始化,就能避免这种 fallback 到默认字体的问题啦。

内容的提问来源于stack exchange,提问作者Kristof Van Landschoot

火山引擎 最新活动