当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
相关产品推荐
相关产品推荐

