[NSFont fontWithName] 等效的 CoreText

Posted

技术标签:

【中文标题】[NSFont fontWithName] 等效的 CoreText【英文标题】:CoreText equivalent for [NSFont fontWithName] 【发布时间】:2015-03-31 05:52:36 【问题描述】:

在我们的应用程序中,我们将自定义对象的字体存储为包含字体名称的字符串(从字体面板中检索)并使用

+ (NSFont *)fontWithName:(NSString *)fontName

现在在加载或导入文件时,我们想检查字体名称是否会在当前系统上真正解析。

由于某些设计限制,我们需要在普通的旧 C/C++ 中执行检查,即现在使用 CoreText

但是,似乎不存在与fontWithName: 类似的等效 CoreText API 调用:

CTFontCreateWithName 总是在使用后备策略时返回字体 CTFontCopyFullName 似乎使用了与 NSFont..? 接受/使用的名称不同的名称?

所以基本上问题是: 我们如何使用CoreText功能检查当前系统上是否存在字体,以及稍后使用[NSFont fontWithName:]可以成功实例化字体..?

【问题讨论】:

【参考方案1】:

似乎CTFontCopyPostScriptName() 将始终为[NSFont fontWithName:] 理解的任何字符串返回有效结果 - 反之亦然。

至少在我跨 10.8 - 10.10 的实验中,使用有效和虚构的字体名称,CTFontCopyPostScriptName() 的结果总是可以用来验证字体名称是否对NSFont 有效。

编辑 #1 一些实验表明,为了安全起见,最好还添加一个带有 CTFontCopyFamilyName() 的后备。

【讨论】:

以上是关于[NSFont fontWithName] 等效的 CoreText的主要内容,如果未能解决你的问题,请参考以下文章

UIFont fontWithName 字体名称

UIFont 字体样式 [UIFont fontWithName~];

字体“SF Mono”的 NSFont 名称是啥?

Cocoa NSFont 'leading' 属性构建错误

Cocoa NSFont 'leading' 属性构建错误

从 NSFont 获取所有字符