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
объекта.