API 支持吗?如果没有,我该怎么办?
Core Text中有CTFontCreatePathForGlyph
,可以将单个字符翻译成路径。我可以在循环中使用它来创建我的字符串作为路径,但我必须处理间距和字偶距以及所有其他令人讨厌的事情。我正在寻找一个字符串路径,如果它是在具有相同字体和大小的 UILabel 中绘制的,则该路径看起来会相同。
最佳答案
有一篇文章叫Low-level text rendering通过 Ohmu这相当广泛地涵盖了这一点。我已经尝试过这段代码并可以确认它有效。
不过,它确实使用了 Core Text,因此渲染可能与 UILabel
的渲染不完全相同。此外,示例文章仅涉及一行。要将其扩展到多行,您必须设置完整的核心文本系统。而不是:
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()
来获取每行的位置,并将该位置添加到每个渲染的字形中(可能在使用文本矩阵对其进行转换之后)。
关于ios - 如何在 iOS 中创建多行字符串或多行标签作为 CGPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573383/