如何创建同时具备黑重(比粗体更粗)字重和斜体样式的UIFont对象
问题根因
UIFontDescriptor的withSymbolicTraits(_:)方法生成新描述符时,不会保留原有traits字典中自定义的字重参数,会默认重置为常规字重,因此拆分设置字重和斜体的写法会丢失黑重配置。
修复代码
将字重与斜体特征合并到同一套trait配置中,避免特征被覆盖:
var fontTraits: [UIFontDescriptor.TraitKey: Any] = [:] fontTraits[.weight] = UIFont.Weight.black fontTraits[.symbolic] = UIFontDescriptor.SymbolicTraits.traitItalic.rawValue let fontAttributes: [UIFontDescriptor.AttributeName: Any] = [.traits: fontTraits] let descriptor = UIFontDescriptor(fontAttributes: fontAttributes) let font = UIFont(descriptor: descriptor, size: 19.0) label.font = font
如果需要适配Helvetica、Avenir等非系统字体,可采用特征合并的写法,全程无需硬编码字体名称:
// 先获取对应字重的基础字体描述符,可按需替换基础字体的匹配规则 let baseFont = UIFont.systemFont(ofSize: 19, weight: .black) var traits = baseFont.fontDescriptor.fontAttributes[.traits] as? [UIFontDescriptor.TraitKey: Any] ?? [:] // 合并斜体特征,保留原有字重配置 traits[.symbolic] = (traits[.symbolic] as? UInt32 ?? 0) | UIFontDescriptor.SymbolicTraits.traitItalic.rawValue let finalDescriptor = baseFont.fontDescriptor.addingAttributes([.traits: traits]) let finalFont = UIFont(descriptor: finalDescriptor, size: 19.0)
以上写法对所有包含对应字重+斜体变体的字体均生效。
内容的提问来源于stack exchange,提问作者christianselig
相关产品推荐
相关产品推荐

