对于给定的 NSRange
,我想在 CGRect
中找到一个 UILabel
,它对应于那个 NSRange
的字形。例如,我想在句子“The quick brown fox jumps over the lazy dog”中找到包含单词“dog”的 CGRect
。
诀窍是, UILabel
有多行,而文本实际上是 attributedText
,因此找到字符串的确切位置有点困难。
我想在我的 UILabel
子类上编写的方法看起来像这样:
- (CGRect)rectForSubstringWithRange:(NSRange)range;
详情,有兴趣的可以看看:
我的目标是能够创建一个具有 UILabel 确切外观和位置的新 UILabel,然后我可以对其进行动画处理。其余的我已经弄清楚了,但尤其是这一步让我退缩了。
到目前为止我为尝试解决问题所做的工作:
UITextView
和 UITextField
上,而不是 231343141 , 我敢打赌,正确答案涉及以下之一:
UILabel
和 NSLayoutManager
更新:这是一个 github 要点,其中包含我迄今为止尝试解决此问题的三件事:https://gist.github.com/bryanjclark/7036101
最佳答案
在代码中 Joshua's answer 之后,我想出了以下似乎运行良好的方法:
- (CGRect)boundingRectForCharacterRange:(NSRange)range
{
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size];
textContainer.lineFragmentPadding = 0;
[layoutManager addTextContainer:textContainer];
NSRange glyphRange;
// Convert the range for glyphs.
[layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange];
return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
}
关于ios - 如何在 UILabel 中找到文本子字符串的 CGRect?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19417776/