xcode 如何在CTFeatureTypeIdentifier不可用时使用UIFontDescriptor

aurhwmvo  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(149)

我使用下面的代码片段来获取字体特性:

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特征类型标识符

zbwhf8kr

zbwhf8kr1#

首先,您的字距调整禁用代码在两个方面是错误的:

  • 在非常混乱的UIFontDescriptor.FeatureKey名称空间中,.featureIdentifier.typeIdentifier被弃用,分别被.type.selector取代(我几年前就提交了一个关于这些旧名称的bug,看起来苹果听到了我的建议,并改变了它们。万岁!)
  • 对于对应于这些键的 values,如果没有必要,不要使用原始数字;难以辨认和易碎的东西。这些东西通常有固定的名字。

所以当你说

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

你应该说

let fontDescriptorFeatureSettings = [
    [ 
        UIFontDescriptor.FeatureKey.type: kTextSpacingType,
        UIFontDescriptor.FeatureKey.selector: 8,
    ],
]
// I couldn't find a name for the `8` here

好了,要得到一个串行化的I,指定kStylisticAltSixOnSelector作为你的kStylisticAlternativesType

let fontDescriptorFeatureSettings = [
    [ 
        UIFontDescriptor.FeatureKey.type: kStylisticAlternativesType,
        UIFontDescriptor.FeatureKey.selector: kStylisticAltSixOnSelector,
    ],
]

现在,你可能会说,“好吧,好吧,但是我还得到了一些我不需要的其他变化,比如弯曲的”ell“和斜线的"0”。”
这是正确的,但是在使用UIFontDescriptor的高级操作中,您对此无能为力。您在字典中找到的是 * 单独的字形变体。* 访问这些变体的唯一方法是 * 直接使用CoreText绘制文本 *。而且我不认为你会想要深入到文本绘制的层次,你想要做的只是把这个文本放到一个UILabel或者类似的东西中,然后完成它;在这种情况下,打开alt六变种是你能做的最好的。

相关问题