现在,我阅读了有关Core Text的Apple文档,但在理解上有一个问题:

CTFontSymbolicTraits
符合OptionSet。并且CTFontStylisticClass可以通过classMaskTrait中的CTFontStylisticClass选项获得。

我可以理解classMaskTrait选项可以包含所有CTFontStylisticClass选项吗?例如,如果我想在sansSerifClass中检测CTFontStylisticClass选项:

CTFontStylisticClass(rawValue: CTFontGetSymbolicTraits(font).rawValue).contains(.sansSerifClass)


例子检查正确吗?

最佳答案

要了解这些常量,让我们看一下CTFontStylisticClass documentation


  类值捆绑在CTFontSymbolicTraits的高四位中,可以通过kCTFontClassMaskTrait获得。


为了验证,让我们看一下kCTFontClassMaskTrait documentation。如果将语言设置为Objective-C,则文档显示kCTFontClassMaskTrait的定义:


kCTFontClassMaskTrait = kCTFontTraitClassMask



因此,它只是被定义为另一个常数,该常数具有相同的单词,但顺序不同。哈哈,苹果,你真好笑。

好吧,让我们看一下kCTFontTraitClassMask documentation。同样,如果将语言设置为Objective-C,则可以看到常量的定义:


kCTFontTraitClassMask = (15U << kCTFontClassMaskShift)



实际上,15U是四个连续的1位,并且向左移了一些。这是典型的“掩码”:它定义了二进制字中位的子集。

要将CTFontSymbolicTraits转换为CTFontStylisticClass,我们需要使用掩码从CTFontSymbolicTraits原始值中仅选择那些位,并将结果用作CTFontStylisticClass的原始值。我们可以使用按位运算符&或使用OptionSet方法intersection进行选择。

在Swift中,我们真正想要的是提取CTFontSymbolicTraitsCTFontStylisticClass方法。因此,让我们写一个扩展:

extension CTFontSymbolicTraits {
    var stylisticClass: CTFontStylisticClass {
        return CTFontStylisticClass(rawValue: self.intersection(.classMaskTrait).rawValue)
    }
}


让我们测试一下:

import CoreText
import Foundation

extension CTFontSymbolicTraits {
    var stylisticClass: CTFontStylisticClass {
        return CTFontStylisticClass(rawValue: self.intersection(.classMaskTrait).rawValue)
    }
}

func checkSansSerifness(fontName: String) {
    let font = CTFontCreateWithName(fontName as CFString, 12, nil)
    let fullName = CTFontCopyName(font, kCTFontFullNameKey)!
    if CTFontGetSymbolicTraits(font).stylisticClass.contains(.sansSerifClass) {
        print("\(fullName) is sans serif.")
    } else {
        print("\(fullName) is not sans serif.")
    }
}

checkSansSerifness(fontName: "Helvetica")
checkSansSerifness(fontName: "Times New Roman")


输出:

Helvetica is sans serif.
Times New Roman is not sans serif.

关于ios - 选项在Swift中设置交集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53489197/

10-09 07:20