现在,我阅读了有关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中,我们真正想要的是提取
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.
关于ios - 选项在Swift中设置交集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53489197/