如何获取特定字重的SF Pro Display斜体系统字体?
获取特定字重的San Francisco Pro斜体系统字体
你说得完全没错——iOS系统自带的UIFont.systemFont(ofSize:weight:)确实只能拿到非斜体的全字重字体,而UIFont.italicSystemFont(ofSize:)也仅能获取Regular字重的斜体版本。要拿到像「SF Pro Display Heavy Italic」这类特定字重的斜体系统字体,确实得用到UIFont(name: String, size: CGFloat),但我们可以通过封装来避免重复写繁琐的字体名称字符串。
第一步:明确San Francisco Pro的斜体字体名称
先把常用字重和对应的官方字体名称对应好,以SF Pro Display为例:
- 超轻斜体:
SFProDisplay-UltralightItalic - 细斜体:
SFProDisplay-ThinItalic - 轻斜体:
SFProDisplay-LightItalic - 常规斜体:
SFProDisplay-Italic(就是系统italicSystemFont对应的字体) - 中等斜体:
SFProDisplay-MediumItalic - 半粗斜体:
SFProDisplay-SemiboldItalic - 粗斜体:
SFProDisplay-BoldItalic - 重斜体:
SFProDisplay-HeavyItalic - 特粗斜体:
SFProDisplay-BlackItalic
如果是用于正文的SF Pro Text系列,只需要把名称里的Display替换成Text即可,比如SFProText-HeavyItalic。
第二步:封装成UIFont扩展,简化调用
为了不用每次手动敲字体名称,我们可以给UIFont写个扩展,模仿系统方法的调用逻辑:
extension UIFont { /// 获取指定字重的SF Pro Display斜体字体 static func displayItalicSystemFont(ofSize size: CGFloat, weight: UIFont.Weight) -> UIFont? { let fontName: String switch weight { case .ultraLight: fontName = "SFProDisplay-UltralightItalic" case .thin: fontName = "SFProDisplay-ThinItalic" case .light: fontName = "SFProDisplay-LightItalic" case .regular: fontName = "SFProDisplay-Italic" case .medium: fontName = "SFProDisplay-MediumItalic" case .semibold: fontName = "SFProDisplay-SemiboldItalic" case .bold: fontName = "SFProDisplay-BoldItalic" case .heavy: fontName = "SFProDisplay-HeavyItalic" case .black: fontName = "SFProDisplay-BlackItalic" default: fontName = "SFProDisplay-Italic" } return UIFont(name: fontName, size: size) } /// 获取指定字重的SF Pro Text斜体字体 static func textItalicSystemFont(ofSize size: CGFloat, weight: UIFont.Weight) -> UIFont? { let fontName: String switch weight { case .ultraLight: fontName = "SFProText-UltralightItalic" case .thin: fontName = "SFProText-ThinItalic" case .light: fontName = "SFProText-LightItalic" case .regular: fontName = "SFProText-Italic" case .medium: fontName = "SFProText-MediumItalic" case .semibold: fontName = "SFProText-SemiboldItalic" case .bold: fontName = "SFProText-BoldItalic" case .heavy: fontName = "SFProText-HeavyItalic" case .black: fontName = "SFProText-BlackItalic" default: fontName = "SFProText-Italic" } return UIFont(name: fontName, size: size) } }
第三步:轻松调用封装后的方法
现在你可以像调用系统方法一样获取特定字重的斜体字体了:
// 获取24号的SF Pro Display Heavy Italic let heavyItalicDisplayFont = UIFont.displayItalicSystemFont(ofSize: 24, weight: .heavy) // 获取16号的SF Pro Text Medium Italic let mediumItalicTextFont = UIFont.textItalicSystemFont(ofSize: 16, weight: .medium)
补充说明
这些字体名称是苹果官方标准命名,在iOS 9及以上系统都能正常使用,不用担心兼容性问题。如果你的App需要兼容更早的系统,可以额外加个字体存在性判断,但现在绝大多数App都不用考虑iOS 8及以下的情况了。
内容的提问来源于stack exchange,提问作者Marmelador
相关产品推荐
相关产品推荐

