CTFontGetGlyphsForCharacters输入emoji时返回false的问题求助
你遇到的问题和编码差异无关,核心原因是CTFontGetGlyphsForCharacters只会从你传入的指定字体中查找对应字符的字形,当输入emoji时,NSLayoutManager为了正确渲染emoji,会传入专门的Apple Emoji字体作为aFont参数,而这款字体仅包含emoji相关的字形,没有你要的U+00B7中间点字符的字形,因此调用返回false。
解决方案
- 方案1:固定使用系统文本字体获取中间点字形
不要直接用传入的aFont,改为使用和当前字号匹配的系统文本字体,系统文本字体默认包含U+00B7的字形:
// 替换原来获取glyph的部分代码 let middleDot: [UniChar] = [0x00B7] var myGlyphs: [CGGlyph] = [0] // 用和当前字号一致的系统字体,而非传入的aFont let fallbackFont = UIFont.systemFont(ofSize: aFont.pointSize) guard CTFontGetGlyphsForCharacters(fallbackFont, middleDot, &myGlyphs, middleDot.count) else { fatalError("Failed to get the glyphs for characters \(middleDot).") }
- 方案2:添加字体 fallback 逻辑
如果需要优先使用传入的字体,可先尝试用aFont获取字形,失败后再切换到备用字体:
let middleDot: [UniChar] = [0x00B7] var myGlyphs: [CGGlyph] = [0] var targetFont = aFont // 先尝试用传入的字体获取,失败则用系统字体 fallback if !CTFontGetGlyphsForCharacters(targetFont, middleDot, &myGlyphs, middleDot.count) { targetFont = UIFont.systemFont(ofSize: aFont.pointSize) guard CTFontGetGlyphsForCharacters(targetFont, middleDot, &myGlyphs, middleDot.count) else { fatalError("Failed to get the glyphs for characters \(middleDot).") } }
内容的提问来源于stack exchange,提问作者WikipediaBrown
相关产品推荐
相关产品推荐

