如何在iOS中创build多行string或多行标签作为CGPath?

API是否支持这个? 如果不是,我怎么办呢?

Core Text中有CTFontCreatePathForGlyph ,可以将单个字符转换为path。 我可以在循环中使用它来创build我的string作为path,但我不得不处理间距和字距以及所有其他的讨厌的东西。 我正在寻找一个stringpath,如果它是用相同的字体和大小的UILabel绘制,看起来是相同的。

有一篇叫Ohmu 的低级文本渲染 文章 ,涵盖了相当广泛的内容。 我已经试过这个代码,可以确认它的工作。

它确实使用核心文本,所以渲染可能不完全像UILabel 。 此外,示例文章只处理一行。 要将其扩展为多行,您必须设置完整的核心文本系统。 代替:

 CTLineRef line = CTLineCreateWithAttributedString( attStr ) ; 

您需要按照“核心文本编程指南”中所述设置CTFramesetterRefCTFramesetterCreateWithAttributedString )和CTFrameRefCTFramesetterCreateFrame )。 然后可以使用CTFrameGetLines()获取帧中的所有行。

然后,您将在示例文章中包装for循环:

 CFArrayRef runArray = CTLineGetGlyphRuns(line); // for each RUN for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++) 

另一个遍历所有行的循环。 循环的内核应该是相同的。

示例文章创build一个graphics上下文,并将单个字形的path添加到该上下文的path,但是您可以轻松地创build一个CGMutablePathRefUIBezierPath ,并将单个字形的path添加到该对象。

有一件事不是100%清楚的,没有testing这个是如何调整最终path中字形的垂直位置。 您可能需要调用CTFrameGetLineOrigins()来获取每行的位置,并将这个位置添加到每个渲染的字形(可能在用文本matrix变换之后)。

查看此项目中的UIBezierPath + TextPaths类别: https : //github.com/aderussell/string-to-CGPathRef 。

它显示了如何创build单行和多行string的path,以及如何将它们与CAShapeLayers一起使用。

该类别只是一个包装,内部函数可以在iOS或Mac OS X中使用,您只需要将您的项目链接到CoreText框架。