使用文本编辑应用程序时,选择一种字体(如“Menlo”)呈现字形,当所选字体不包含特殊字形时(如“”,是简单的中文字形,“Menlo”没有' t 包含它),应用程序会为您选择一种字体来呈现它,在 MacOS(Catalina)中,大约有 62 种字体(STBaoliSC-Regular、STKaiti、STSong、PingFangSC-Regular...)包含这个字形“”,我发现几乎每个文本编辑应用程序(vscode、sublime text、TextEdit)都采用相同的字体——“PingFangSC-Regular”,所以我考虑是否每个字形都有自己的默认字体?如果是这样,我怎样才能获得字体名称?
问问题
248 次
1 回答
2
这由“级联列表”处理。如果您想要默认列表,可以通过CTFontCopyDefaultCascadeListForLanguages
, 以每种字体为基础:
import CoreText
let font = CTFontCreateWithName("Helvetica" as CFString, 12, nil)
let descriptors = CTFontCopyDefaultCascadeListForLanguages(font, nil)! as! [CTFontDescriptor]
如果你想查看列表,你可以这样做(Core Text 与 Swift 没有很好的桥接):
for descriptor in descriptors {
let attributes = CTFontDescriptorCopyAttributes(descriptor) as! [String: Any]
print(attributes[kCTFontNameAttribute as String]!)
}
==>
LucidaGrande
.AppleSymbolsFB
GeezaPro
NotoNastaliqUrdu
Thonburi
Kailasa
PingFangSC-Regular
PingFangTC-Regular
AppleSDGothicNeo-Regular
PingFangTC-Regular
PingFangSC-Regular
PingFangHK-Regular
PingFangSC-Regular
HiraginoSans-W3
HiraginoSansGB-W3
KohinoorBangla-Regular
KohinoorDevanagari-Regular
KohinoorGujarati-Regular
MuktaMahee-Regular
NotoSansKannada-Regular
KhmerSangamMN
LaoSangamMN
MalayalamSangamMN
NotoSansMyanmar-Regular
NotoSansZawgyi-Regular
NotoSansOriya
SinhalaSangamMN
TamilSangamMN
KohinoorTelugu-Regular
NotoSansArmenian-Regular
EuphemiaUCAS
Menlo-Regular
STIXGeneral-Regular
Galvji
Kefa-Regular
.NotoSansUniversal
AppleColorEmoji
PingFangSC-Regular 是列表中的第一个东亚字体,因此它将被选为替代 Helvetica 的字体。它也是 Lucida Grande 和 Helvetica Neue 级联列表中的第一个东亚字体。它是一种直截了当,甚至无聊的字体。但是,如果你使用的是更不寻常的字体,比如 American Typewriter?好吧,那将被松提取代,它更轻一些。Marker Felt 替换为 Kaiti,它在行程宽度上有更多的变化(尽管 IMO 用 Kaiti Black 代替它会好于常规)。我不知道任何内置亚洲字体与可用的拉丁字体一样“有趣”,但如果你有一个,你可以自定义级联列表来选择它(在 Mac 上使用 NSFontDescriptor,在 iOS 上使用 UIFontDescriptor )。
如果您想了解有关级联列表的更多详细信息,请参阅 WWDC 2018 视频,为全球受众创建应用程序。
于 2019-11-17T23:24:54.743 回答