API是否支持此功能?如果没有,我怎么能这样做?
Core Text中有CTFontCreatePathForGlyph
,可以将单个字符转换为路径。我可以在循环中使用它来创建我的字符串作为路径,但我必须处理间距和字距以及所有其他讨厌的事情。我正在寻找一个看起来相同的字符串路径,如果它是在具有相同字体和大小的UILabel中绘制的。
答案 0 :(得分:2)
Low-level text rendering有一篇名为Ohmu的文章,涵盖了相当广泛的内容。我已经尝试过这段代码并且可以确认它是否有效。
它确实使用了Core Text,因此渲染可能与UILabel
的渲染不完全相同。此外,样本文章只处理一行。要将其扩展为多行,您必须设置完整的Core Text系统。而不是:
CTLineRef line = CTLineCreateWithAttributedString( attStr ) ;
您需要设置CTFramesetterRef
(CTFramesetterCreateWithAttributedString
)和CTFrameRef
(CTFramesetterCreateFrame
),如“核心文本编程指南”中所述。然后,您可以使用CTFrameGetLines()
获取框架中的所有行。
然后,您将在示例文章中包装for
循环:
CFArrayRef runArray = CTLineGetGlyphRuns(line);
// for each RUN
for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++)
使用另一个遍历所有行的循环。循环的内核应该是相同的。
示例文章创建了一个图形上下文,并将单个字形的路径添加到此上下文的路径中,但您可以轻松创建CGMutablePathRef
或UIBezierPath
并将单个字形的路径添加到该路径对象
如果不对此进行测试,我不能100%明白的一件事是如何在最终路径中调整字形的垂直位置。您可能需要调用CTFrameGetLineOrigins()
来获取每一行的位置,并将此位置添加到每个渲染的字形(可能在使用文本矩阵转换后)。
答案 1 :(得分:2)
查看此项目中的UIBezierPath + TextPaths类别:https://github.com/aderussell/string-to-CGPathRef。
它显示了如何为单行和多行字符串创建路径以及如何将它们与CAShapeLayers一起使用。
该类别只是一个包装器,内部功能可以在iOS或Mac OS X中使用,您只需将项目链接到CoreText框架即可。