UIFont:如何使用文体替代字符?

FE_*_*ech 5 typography uifont ios swift

在我的应用程序中,我想stylistic alternate font 用于 'a' 而不是system font.

附件screenshot解释了字体的不同呈现。

在此处输入图片说明

我怎样才能启用这种行为UILabelUITextView以便它呈现正确的一层'a'?

我确实找到了一个YouTube video 链接,它完全解释了这一点,但他正在使用 acustom font并且它是硬编码的。我只想使用system font但与这个替代字符。

我也许可以硬编码UILabelcustom character,我不知道,因为我想用System font。我不想使用custom Font. 什么UITextView是编辑?我们如何让它a在用户输入时使用替代?

Rob*_*ier 10

这是一种称为“替代文体集”的字体功能,您可以使用 CoreText 对其进行配置。请记住,并非所有字体都有此选项,但系统字体有。但是,您需要弄清楚您想要哪种替代方案。

首先,创建您感兴趣的字体:

import CoreText
import UIKit

let baseFont = UIFont.systemFont(ofSize: 72)
Run Code Online (Sandbox Code Playgroud)

然后打印出它的特征:

print(CTFontCopyFeatures(baseFont)!)
Run Code Online (Sandbox Code Playgroud)

找到关于替代文体集的部分,特别是你想要的集,“一层楼:”

    {
    CTFeatureTypeIdentifier = 35;
    CTFeatureTypeName = "Alternative Stylistic Sets";
    CTFeatureTypeSelectors =         (
                    {
            CTFeatureSelectorIdentifier = 2;
            CTFeatureSelectorName = "Straight-sided six and nine";
        },
                    {
            CTFeatureSelectorIdentifier = 4;
            CTFeatureSelectorName = "Open four";
        },
                    {
            CTFeatureSelectorIdentifier = 6;
            CTFeatureSelectorName = "Vertically centered colon";
        },
                    {
            CTFeatureSelectorIdentifier = 10;
            CTFeatureSelectorName = "Vertically compact forms";
        },
                    {
            CTFeatureSelectorIdentifier = 12;
            CTFeatureSelectorName = "High legibility";
        },
                    {
            CTFeatureSelectorIdentifier = 14;
            CTFeatureSelectorName = "One storey a";
        },
        ...
Run Code Online (Sandbox Code Playgroud)

重要的数字是选择器 (CTFeatureSelectorIdentifier),14。有了它,您可以创建一个新的字体描述符和新字体:

let descriptor = CTFontDescriptorCreateCopyWithFeature(
    baseFont.fontDescriptor,
    kStylisticAlternativesType as CFNumber,
    14 as CFNumber)
Run Code Online (Sandbox Code Playgroud)

或者,如果更方便,您可以直接在 UIKit 中执行此操作:

let settings: [UIFontDescriptor.FeatureKey: Int] = [
    .featureIdentifier: kStylisticAlternativesType,
    .typeIdentifier: 14
]

let descriptor = baseFont.fontDescriptor.addingAttributes([.featureSettings: [settings]])
Run Code Online (Sandbox Code Playgroud)

(请注意有点令人惊讶的事实,.featureIdentifier即“CTFeature类型标识符”和.typeIdentifier“CTFeature选择器标识符”。)

然后你可以创建一个新字体(零大小意味着保持大小不变​​):

let font = UIFont(descriptor: descriptor, size: 0)
Run Code Online (Sandbox Code Playgroud)

您可以在任何接受 UIFont 的地方使用它。