Чтобы понять эти константы, давайте посмотрим на CTFontStylisticClass
документацию:
Значения класса объединены в старшие четыре бита CTFontSymbolicTraits
и могут быть получены через kCTFontClassMaskTrait
.
Чтобы проверить, давайте посмотрим на kCTFontClassMaskTrait
документацию. Если вы установите язык Objective-C, документация покажет определения kCTFontClassMaskTrait
:
kCTFontClassMaskTrait = kCTFontTraitClassMask
Так что это просто определено как еще одна константа, которая имеет все те же слова в другом порядке. Ха-ха, Apple, ты веселый.
Хорошо, давайте посмотрим на kCTFontTraitClassMask
документацию. Опять же, если вы установите язык 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.
person
rob mayoff
schedule
26.11.2018
font
и на какой вопрос о нем вы пытаетесь ответить? - person matt   schedule 27.11.2018