swift - NSFontDescriptor.withSymbolicTraits更改我的字体名称

标签 swift macos cocoa

enter image description here
正如您在图片中看到的,字体的名称在开头是“Helvetica”,我调用font.fontDescriptor.withSymbolicTraits:创建一个字体描述符,然后使用该描述符创建一个新字体。但是新字体的名称变成了Arial-ItalicMT。怎么会这样?谢谢。

最佳答案

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;
}
*/

哪儿也没提到赫尔维蒂卡!如果使用此描述符初始化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

关于swift - NSFontDescriptor.withSymbolicTraits更改我的字体名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50199749/

相关文章:

android - Erro安装Android Target-Cordova CLI

mysql - MySQL v5.7.11安装编译后报错

cocoa - 滥用 NSNotificationCenter

objective-c - 更改披露三角形的方向

ios - 如何使用 RegEx 测试阿拉伯语中的阿联酋号码?

swift - 在 Swift 中根据 HTTP 图像响应调整 UIImageView 的大小

swift - 如何将 textField.text 值转换为整数并对两个整数求和

python - 使用python 3.7导入pyobjc AppKit时如何摆脱不必要的调试输出

objective-c - 在 Cocoa/OSX 中覆盖鼠标图像

ios - Swift 返回一个带有 CloudKit 数据的函数