Опция Устанавливает пересечения в Swift - PullRequest
0 голосов
/ 27 ноября 2018

Теперь я читаю документацию Apple о Core Text, и у меня есть одна проблема в понимании:

CTFontSymbolicTraits соответствует OptionSetCTFontStylisticClass можно получить с помощью опции classMaskTrait в CTFontStylisticClass.

Правильно ли я понимаю, что опция classMaskTrait может включать все опции CTFontStylisticClass ?.Например, если я хочу обнаружить опцию sansSerifClass в CTFontStylisticClass:

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

, это правильный пример проверки?

1 Ответ

0 голосов
/ 27 ноября 2018

Чтобы понять эти константы, давайте посмотрим на документацию 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.
...