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




