我对字体和编码有了基本的了解,但最近我不得不在我的舒适区之外做一些事情:转动字符✖(0x2716
“重乘 x”)变为CGPathRef
.
我使用了核心文本CTFontGetGlyphsForCharacters
来完成这项工作。我明白,一个CGGlyph
实际上是给定字体支持的字形集的索引。我很快发现 iOS 上只有极少数字体支持这个字形,包括我选择的 Zapf Dingbats。
我的问题是:我可以在任何字体中使用 ✖,只需将其粘贴即可。我在 Pages 中做了一个小实验,将 ✖ 粘贴到文档中,选择它,然后不断更改字体。我做了一个类似的程序化实验。字形始终正确显示(并且从未改变)。如果这些字体中很少有 ✖,这是如何工作的?如果给定的字体没有这样的符号,是否有一些“后备字形”(我猜这将是“后备字体”)?如果是这样,有什么方法可以以编程方式访问这些字形吗?
Core Text 中的后备字体列表称为“级联列表”,它是CTFontDescriptor
(the kCTFontCascadeListAttribute
).
系统默认的级联列表可以通过以下方式访问CTFontCopyDefaultCascadeListForLanguages()
。由于某种原因,该函数尚未在 Apple 网站上记录,但以下是“CTFont.h”头文件中的文档:
/*!
@function CTFontCopyDefaultCascadeListForLanguages
@abstract Return an ordered list of CTFontDescriptorRef's for font
fallback derived from the system default fallback region
according to the given language preferences. The style of
the given is also matched as well as the weight and width
of the font is not one of the system UI font, otherwise
the UI font fallback is applied.
@param font
The font reference.
@param languagePrefList
The language preference list - ordered array of
CFStringRef's of ISO language codes.
@result The ordered list of fallback fonts - ordered array of
CTFontDescriptors.
*/
CFArrayRef CTFontCopyDefaultCascadeListForLanguages(
CTFontRef font,
CFArrayRef languagePrefList ) CT_AVAILABLE(10_8, 6_0);
在 Mac OS X 10.10 上,默认的英文级联列表包含 26 种字体,涵盖多种语言和符号。
您可以为自己定制级联列表/后备字体CTFont
实例通过设置kCTFontCascadeListAttribute
自定义的属性CTFontDescriptor
到后备数组CTFontDescriptor
对象。然后,将其变成CTFont
with CTFontCreateWithFontDescriptor()
。如果您没有在您的设备上设置自定义级联列表CTFontDescriptor
,默认情况下会使用全局列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)