我想做的是创建一个文本容器组件,该组件能够在触摸时指示最近的单词是什么(即触摸点“后面”的单词)。
首先,我创建了一个 UILabel 子类并重写 TouchesEnded:withEvent: 方法来确定触摸的 CGPoint。我还编写了一个方法,使用 sizeWithFont:forWidth:lineBreakMode: 计算文本每个单词的相应“框架”(CGRect)。通过被触摸的 CGPoint 和这个框架,我可以确定哪个单词实际上被触摸了。但计算框架的方法仅适用于单行文本。
所以现在我需要知道文本的哪一部分位于给定行上(即文本如何分割),以便我可以计算出每个单词的正确左边距和上边距。
知道如何获得这个吗?
或者也许您有更直接的解决方案来实现这一目标?不幸的是这篇文章没有太大帮助.........
(您的 linkedin 帖子中有一个示例代码项目的链接,其中确实包含一些有用的示例代码,但我也会在这里为您概述该过程。)
简而言之,您将需要使用 Core Text,它是 Apple 先进的基于 C 的文本处理框架,支持 iOS 和 OS X 中的所有复杂文本布局。
完整的代码将有所涉及,但您需要查看的关键方法是:
CTFramesetterCreateWithAttributedString() - 使用它与从标签文本中获得的 NSAttributedString 结合使用 - 创建框架设置器
CTFramesetterCreateFrame() - 使用它从上面的框架设置器中获取文本的 CTFrameRef。您需要使用标签边界创建 CGPathRef 来执行此操作。
CTFrameGetLines()、CTFrameGetLineOrigins() - 使用它们分别获取与排版行相对应的 CTLineRef 以及行原点的坐标,然后使用 CTLineGetStringIndexForPosition() 查找触摸位置处的字符索引。
然后,您可以使用此字符索引(在行的参考框架中)向后工作并在完整字符串中找到实际的字符/单词/等。
不要忘记,有几个问题会让事情变得复杂:
如果您使用 UILabel 的本机绘图,则必须注意完美匹配您的排版指标,这可能很麻烦,因为大多数对象(例如 CTFontRef)都不能与 UIKit 对应对象免费桥接。有时,实现您自己的绘图可能会更容易,这将保证公制匹配。
Core Text 使用相对于普通 iOS 绘图系统的倒置坐标系。如果你得到了奇怪的结果,特别是如果你自己画画,那么这值得一看。
这不是世界上最简单的任务,但也绝非不可能。祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)