NSFontDescriptor.withSymbolicTraits меняет имя моего шрифта - PullRequest
0 голосов
/ 06 мая 2018

enter image description here

Как вы можете видеть на картинке, имя шрифта "Helvetica" в начале, я вызываю font.fontDescriptor.withSymbolicTraits:, чтобы создать дескриптор шрифта, а затем создаю newFont с дескриптором. Но имя нового шрифта становится Arial-ItalicMT. Как это случилось? Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

TL; DR : добавив withFamily(), вы получите ожидаемый результат:

let font = NSFont(name: "Helvetica", size: 18)!

let descriptor = font.fontDescriptor.withFamily(font.familyName!).withSymbolicTraits(.italic)
let newFont    = NSFont(descriptor: descriptor, size: 18)!

print(font.fontName)    // Helvetica
print(newFont.fontName) // Helvetica-Oblique

Длинный ответ:

NSFontDescriptor похоже на критерии фильтрации шрифтов. В зависимости от того, как вы настроите этот объект, система найдет подходящие шрифты. Давайте рассмотрим дескриптор вашего первого шрифта:

let font = NSFont(name: "Helvetica", size: 18)!
print(font.fontDescriptor)
/*
NSCTFontDescriptor <0x1016168d0> = {
    NSFontNameAttribute = Helvetica;
    NSFontSizeAttribute = 18;
}
*/

Шрифт с именем Helvetica и размером 18. Пока все хорошо. Теперь давайте проверим ваш второй дескриптор:

let descriptor = font.fontDescriptor.withSymbolicTraits(.italic)
print(descriptor)
/*
NSCTFontDescriptor <0x10161b0e0> = {
    NSCTFontTraitsAttribute =     {
        NSCTFontSymbolicTrait = 1;
    };
    NSFontSizeAttribute = 18;
}
*/

Там нет нигде упоминания о Helvetica! Если вы инициализируете NSFont с помощью этого дескриптора, ОС найдет первый доступный курсивный шрифт на вашем компьютере, который будет Arial-ItalicMT. Вы можете проверить, открыв книгу шрифтов.

Необходимо указать, что вы ищете шрифт курсив в семействе Helvetica:

let descriptor = font.fontDescriptor.withSymbolicTraits(.italic).withFamily("Helvetica")
print(descriptor)
/*
NSCTFontDescriptor <0x10113baa0> = {
    NSCTFontTraitsAttribute =     {
        NSCTFontSymbolicTrait = 1;
    };
    NSFontFamilyAttribute = Helvetica;
    NSFontSizeAttribute = 18;
}
*/

let newFont = NSFont(descriptor: descriptor, size: 18)! // Helvetica-Oblique

Чтобы сделать его более общим, вы можете заменить строку "Helvetica" на familyName первого font объекта.

0 голосов
/ 06 мая 2018

Метод экземпляра. withSymbolicTraits возвращает новый дескриптор шрифта, который совпадает с получателем, но с указанными символическими чертами, имеющими приоритет над существующими. Источник

Из того, что я понял. Первый шрифт ранга будет возвращен на основе шрифтов, включенных в macOS Sierra .

В вашем случае .italic вернет Arial-ItalicMT или .bold вернет AlBayan-Bold

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...