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

标签 ios text core-graphics cgpath

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++)

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

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

在没有测试的情况下,我并不是 100% 清楚的一件事是如何调整最终路径中字形的垂直位置。您可能必须调用 CTFrameGetLineOrigins() 来获取每行的位置,并将该位置添加到每个渲染的字形中(可能在使用文本矩阵对其进行转换之后)。

关于ios - 如何在 iOS 中创建多行字符串或多行标签作为 CGPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573383/

相关文章:

ios - 带有 NSTimer 的 GCD 串行队列,dispatch_sync 不等待 NSTimer 完成

ios - NSMutableDictionary:发送到不可变对象(immutable对象)的变异方法

c++ - 正确读取文本文件

MySQL - 根据另一个字段的一部分填充一个字段

html - 从 HTML 文本输入中删除插入符号

iPhone。在实时多人游戏中使用 OpenGL ES 相对于 Core Graphics 有什么好处?

ios - 带有 xcode 的分层主从应用程序

ios - 谷歌分析 ios sdk V2.0 短 session 持续时间

ios - 具有 Spread 和 Size 属性的 CALayer 阴影?

ios - 快速合并两个图像