从字母“P”到点序列需要进行几个步骤。您需要使用Core Text。
- 创建一个
CTFont
。自iOS 7以来,您可以在需要CTFont
的地方使用UIFont
(它们是“toll-free bridged”)。您还可以使用CTFontCreateWithGraphicsFont
函数直接从CGFont
创建CTFont
,或者使用CTFontCreateWithName
(或使用其他几种方法)按名称创建字体。 - 使用
CTFontGetGlyphsForCharacters
函数获取该字母的字形。对于字母“P”,应该只有一个字形。对于某些非英语脚本中的字符,您可能会得到多个(组合)字形。 - 使用
CTFontCreatePathForGlyph
函数获取字形的CGPath
。 - 使用
CGPathApply
枚举路径的元素。 - 将路径的每条线、二次曲线和三次曲线元素转换为一系列点。苹果没有提供公共API来执行此操作。您需要自己完成。对于直线元素很容易。对于曲线元素,如果您不知道如何渲染贝塞尔曲线,则需要进行一些研究。例如,请参见将Bezier曲线转换为多边形链?。
我们可以在Swift playground中轻松进行实验:
import UIKit
import CoreText
import XCPlayground
let font = UIFont(name: "HelveticaNeue", size: 64)!
var unichars = [UniChar]("P".utf16)
var glyphs = [CGGlyph].init(repeating: 0, count: unichars.count)
let gotGlyphs = CTFontGetGlyphsForCharacters(font, &unichars, &glyphs, unichars.count)
if gotGlyphs {
let cgpath = CTFontCreatePathForGlyph(font, glyphs[0], nil)!
let path = UIBezierPath(cgPath: cgpath)
print(path)
XCPlaygroundPage.currentPage.captureValue(value: path, withIdentifier: "glyph \(glyphs[0])")
}
结果:
<UIBezierPath: 0x7fbc89e0d370; <MoveTo {11.072000000000001, 23.808}>,
<LineTo {11.072000000000001, 40.576000000000001}>,
<LineTo {22.975999999999999, 40.576000000000001}>,
<QuadCurveTo {30.560000000000002, 38.432000000000002} - {28.16, 40.576000000000001}>,
<QuadCurveTo {32.960000000000001, 32.192} - {32.960000000000001, 36.288000000000004}>,
<QuadCurveTo {30.560000000000002, 25.920000000000002} - {32.960000000000001, 28.096}>,
<QuadCurveTo {22.975999999999999, 23.808} - {28.16, 23.744}>,
<Close>,
<MoveTo {4.992, 45.695999999999998}>,
<LineTo {4.992, 0}>,
<LineTo {11.072000000000001, 0}>,
<LineTo {11.072000000000001, 18.687999999999999}>,
<LineTo {25.024000000000001, 18.687999999999999}>,
<QuadCurveTo {35.488, 22.208000000000002} - {31.936, 18.623999999999999}>,
<QuadCurveTo {39.039999999999999, 32.192} - {39.039999999999999, 25.792000000000002}>,
<QuadCurveTo {35.488, 42.143999999999998} - {39.039999999999999, 38.591999999999999}>,
<QuadCurveTo {25.024000000000001, 45.695999999999998} - {31.936, 45.695999999999998}>,
<Close>
![P字形路径](https://istack.dev59.com/9Cyqw.webp)