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

当CTFeatureTypeIdentifier不可用时,如何用UIFontDescriptor设置字体特性?

在Swift中启用OpenType字符变体特性(如cv05)

获取字体特性的方法

可以通过CoreText的CTFontCopyFeatures方法查看字体支持的所有特性:

let font = UIFont.systemFont(ofSize: 16)
let features: NSArray = CTFontCopyFeatures(font)!
print("properties = \(features)")

已知Feature Identifier的特性处理

对于带有明确CTFeatureTypeIdentifier的特性(比如“Text Spacing”,标识符22),可以直接构建字体描述符的特性设置,例如此代码可禁用字距调整:

let fontDescriptorFeatureSettings = [
    [ UIFontDescriptor.FeatureKey.featureIdentifier : 22,
      UIFontDescriptor.FeatureKey.typeIdentifier : 8], ]

字符变体(cvXX)特性的处理方案

针对cv05这类无直接显示CTFeatureTypeIdentifier的字符变体特性(对应“Seriffed Capital I”),需要明确其归属的特性类型:

  • 字符变体(Character Variants)对应的CoreText Feature Identifier为20(对应常量kCharacterVariantType)
  • cvXX中的数字XX就是对应的Type Identifier,比如cv05的Type Identifier为5

启用该特性的完整Swift代码:

// 构建字符变体特性设置
let fontDescriptorFeatureSettings = [
    [
        UIFontDescriptor.FeatureKey.featureIdentifier: 20,
        UIFontDescriptor.FeatureKey.typeIdentifier: 5
    ]
]

// 生成带有自定义特性的字体
let baseFont = UIFont.systemFont(ofSize: 16)
let customDescriptor = baseFont.fontDescriptor.addingAttributes([
    .featureSettings: fontDescriptorFeatureSettings
])
let customFont = UIFont(descriptor: customDescriptor, size: 16)

验证特性标识符的方法

如果不确定某个OpenType标签对应的标识符,可以解析CTFontCopyFeatures返回的结果,字符变体特性的结构示例:

{
    CTFeatureTypeName = "Character Variants";
    CTFeatureTypeIdentifier = 20;
    CTFeatureSelectors = (
        {
            CTFeatureSelectorName = "Seriffed Capital I";
            CTFeatureSelectorIdentifier = 5;
            CTFeatureSelectorOpenTypeTag = cv05;
        }
    );
}

内容的提问来源于stack exchange,提问作者Gizmodo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:45:36