这由“级联列表”处理。如果您想要默认列表,可以通过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 代替它会好得多,而不是 Regular)。我不知道任何内置亚洲字体与可用的拉丁字体一样“有趣”,但如果你有一个,你可以自定义级联列表来选择它(在 Mac 上使用 NSFontDescriptor,在 iOS 上使用 UIFontDescriptor )。
如果您想了解有关级联列表的更多详细信息,请观看 WWDC 2018 视频,Creating Apps for a Global Audience.