【发布时间】:2013-10-25 09:57:45
【问题描述】:
对于给定的NSRange,我想在UILabel 中找到与NSRange 的字形相对应的CGRect。例如,我想在“The quick brown fox jumps over the lazy dog”这句话中找到包含“dog”一词的CGRect。
诀窍是,UILabel 有多行,而文字确实是attributedText,所以要找到字符串的确切位置有点困难。
我想在我的 UILabel 子类上编写的方法如下所示:
- (CGRect)rectForSubstringWithRange:(NSRange)range;
详情,有兴趣的朋友:
我的目标是能够创建一个具有 UILabel 确切外观和位置的新 UILabel,然后我可以制作动画。我已经弄清楚了其余的,但它是尤其是这一步,现在让我退缩了。
到目前为止,我为尝试解决问题所做的工作:
- 我希望在 iOS 7 中会有一些 Text Kit 可以解决这个问题,但我看到的大多数 Text Kit 示例都集中在
UITextView和UITextField,而不是UILabel。 - 我在这里看到 Stack Overflow 上的另一个问题,该问题有望解决问题,但接受的答案已有两年多的历史,而且代码在属性文本上表现不佳。
我敢打赌,这个问题的正确答案涉及以下之一:
- 使用标准文本工具包方法在一行代码中解决此问题。我敢打赌它会涉及
NSLayoutManager和textContainerForGlyphAtIndex:effectiveRange - 编写一个复杂的方法,将 UILabel 分成几行,并在一行中找到一个字形的矩形,很可能使用 Core Text 方法。我目前最好的选择是拆开 @mattt's 优秀的 TTTAttributedLabel,它有一种方法可以在某个点找到一个字形 - 如果我将其反转,并找到一个字形的点,那可能会奏效。
更新:这里有一个 github 要点,其中包含我迄今为止尝试解决此问题的三件事:https://gist.github.com/bryanjclark/7036101
【问题讨论】:
-
该死的。为什么 nslayoutmanager 没有暴露在 uilabel 上。试图解决同样的问题。你想出解决方案了吗?
-
还没有回到这个问题上,但是经过大约六次不同的尝试,我最大的希望是实现类似于下面约书亚建议的东西。当我这样做时,我会分享我的发现!
-
也许不是 100% 您需要的,但请查看 github.com/SebastienThiebaud/STTweetLabel。他利用文本视图进行存储和计算。添加您需要的内容作为参考应该相当简单。
-
谢谢,鲍勃!我曾经考虑过使用 STTweetLabel,但最终在 TTTAttributedLabel 上创建了我自己的自定义变体——我将研究 STTweetLabel,看看他们是如何解决这个问题的。听起来这是在正确的轨道上。
-
Luke 的代码在大多数情况下都能正常工作。但有时返回的矩形为零。解决了好久的错误结果,发现还是用UITextView比较好,用UITextView的textContainer和layoutManager,结果更珍贵。我认为 UILabel 的内部 textContainer 和 Luke 的代码生成的可能有一些区别。