现在,我阅读了有关Core Text的Apple文档,但在理解上有一个问题:
CTFontSymbolicTraits
符合OptionSet
。并且CTFontStylisticClass
可以通过classMaskTrait
中的CTFontStylisticClass
选项获得。
我理解classMaskTrait
选项可以包括所有CTFontStylisticClass
选项吗?例如,如果我想检测sansSerifClass
中的CTFontStylisticClass
选项:
CTFontStylisticClass(rawValue: CTFontGetSymbolicTraits(font).rawValue).contains(.sansSerifClass)
检查示例是否正确?
答案 0 :(得分:0)
要了解这些常量,让我们看一下CTFontStylisticClass
documentation:
类值捆绑在
CTFontSymbolicTraits
的高四位中,可以通过kCTFontClassMaskTrait
获得。
要验证,让我们看一下kCTFontClassMaskTrait
documentation。如果将语言设置为Objective-C,则文档将显示kCTFontClassMaskTrait
的定义:
kCTFontClassMaskTrait = kCTFontTraitClassMask
因此,它只是被定义为另一个常数,该常数具有相同的单词,但顺序不同。哈哈,苹果,你真好笑。
好的,让我们看一下kCTFontTraitClassMask
documentation。同样,如果将语言设置为Objective-C,则可以看到常量的定义:
kCTFontTraitClassMask = (15U << kCTFontClassMaskShift)
实际上,15U
是四个连续的1位,向左移了一些。这是典型的“掩码”:它定义了二进制字中位的子集。
要将CTFontSymbolicTraits
转换为CTFontStylisticClass
,我们需要使用掩码从CTFontSymbolicTraits
原始值中仅选择那些位,并将结果用作a的原始值CTFontStylisticClass
。我们可以通过使用按位运算符&
或通过使用OptionSet
方法intersection
来进行选择。
在Swift中,我们真正想要的是在CTFontSymbolicTraits
上提取一个CTFontStylisticClass
的方法。因此,让我们写一个扩展:
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.