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

如何创建同时具备黑重(比粗体更粗)字重和斜体样式的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:15:05