我使用下面的代码片段来获取字体特性:
let font = UIFont.systemFont(ofSize: 16)
let features: NSArray = CTFontCopyFeatures(font)!
print("properties = \(features)")
所以如果我看到这个:
{
CTFeatureTypeExclusive = 1;
CTFeatureTypeIdentifier = 22;
CTFeatureTypeName = "Text Spacing";
CTFeatureTypeSelectors = (
{
CTFeatureSelectorDefault = 1;
CTFeatureSelectorIdentifier = 7;
CTFeatureSelectorName = "No Change";
},
{
CTFeatureSelectorIdentifier = 8;
CTFeatureSelectorName = "No Kerning";
}
);
我可以把它翻译成斯威夫特的话:
let fontDescriptorFeatureSettings = [
[ UIFontDescriptor.FeatureKey.featureIdentifier : 22,
UIFontDescriptor.FeatureKey.typeIdentifier : 8], ]
这成功地为我禁用了字距微调。
在同一个片段中,我看到:
{
CTFeatureOpenTypeTag = cv05;
CTFeatureSampleText = I;
CTFeatureTooltipText = "\U00a9 2015-2022 Apple Inc. All rights reserved.";
CTFeatureTypeExclusive = 1;
CTFeatureTypeName = "Seriffed Capital I";
CTFeatureTypeSelectors = (
{
CTFeatureOpenTypeValue = 0;
CTFeatureSelectorDefault = 1;
CTFeatureSelectorName = Off;
},
{
CTFeatureOpenTypeValue = 1;
CTFeatureSelectorName = On;
}
);
我如何将其转换为Swift以获得一个Serifed“I”?
我的问题是缺乏:
CT特征类型标识符
1条答案
按热度按时间zbwhf8kr1#
首先,您的字距调整禁用代码在两个方面是错误的:
UIFontDescriptor.FeatureKey
名称空间中,.featureIdentifier
和.typeIdentifier
被弃用,分别被.type
和.selector
取代(我几年前就提交了一个关于这些旧名称的bug,看起来苹果听到了我的建议,并改变了它们。万岁!)所以当你说
你应该说
好了,要得到一个串行化的I,指定
kStylisticAltSixOnSelector
作为你的kStylisticAlternativesType
。现在,你可能会说,“好吧,好吧,但是我还得到了一些我不需要的其他变化,比如弯曲的”ell“和斜线的"0”。”
这是正确的,但是在使用UIFontDescriptor的高级操作中,您对此无能为力。您在字典中找到的是 * 单独的字形变体。* 访问这些变体的唯一方法是 * 直接使用CoreText绘制文本 *。而且我不认为你会想要深入到文本绘制的层次,你想要做的只是把这个文本放到一个UILabel或者类似的东西中,然后完成它;在这种情况下,打开alt六变种是你能做的最好的。