如何在iOS中创建多行字符串或多行标签作为CGPath?

时间:2011-09-27 17:38:46

标签: ios text core-graphics cgpath

API是否支持此功能?如果没有,我怎么能这样做?

Core Text中有CTFontCreatePathForGlyph,可以将单个字符转换为路径。我可以在循环中使用它来创建我的字符串作为路径,但我必须处理间距和字距以及所有其他讨厌的事情。我正在寻找一个看起来相同的字符串路径,如果它是在具有相同字体和大小的UILabel中绘制的。

2 个答案:

答案 0 :(得分:2)

Low-level text rendering有一篇名为Ohmu的文章,涵盖了相当广泛的内容。我已经尝试过这段代码并且可以确认它是否有效。

它确实使用了Core Text,因此渲染可能与UILabel的渲染不完全相同。此外,样本文章只处理一行。要将其扩展为多行,您必须设置完整的Core Text系统。而不是:

CTLineRef line = CTLineCreateWithAttributedString( attStr ) ;

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

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

CFArrayRef runArray = CTLineGetGlyphRuns(line);

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

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

示例文章创建了一个图形上下文,并将单个字形的路径添加到此上下文的路径中,但您可以轻松创建CGMutablePathRefUIBezierPath并将单个字形的路径添加到该路径对象

如果不对此进行测试,我不能100%明白的一件事是如何在最终路径中调整字形的垂直位置。您可能需要调用CTFrameGetLineOrigins()来获取每一行的位置,并将此位置添加到每个渲染的字形(可能在使用文本矩阵转换后)。

答案 1 :(得分:2)

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

它显示了如何为单行和多行字符串创建路径以及如何将它们与CAShapeLayers一起使用。

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