gpt4 book ai didi

ios - 如何找到 UILabel 中文本子字符串的 CGRect?

转载 作者:IT王子 更新时间:2023-10-29 07:32:23 26 4
gpt4 key购买 nike

对于给定的 NSRange,我想在 UILabel 中找到一个 CGRect,它对应于 的字形NSRange。例如,我想在“The quick brown fox jumps over the lazy dog”这句话中找到包含单词“dog”的 CGRect

Visual description of problem

诀窍在于,UILabel 有多行,并且文本实际上是 attributedText,因此很难找到字符串的确切位置。

我想在我的 UILabel 子类上编写的方法看起来像这样:

 - (CGRect)rectForSubstringWithRange:(NSRange)range;

详情,有兴趣者:

我的目标是能够创建一个具有 UILabel 的确切外观和位置的新 UILabel,然后我可以对其进行动画处理。我已经弄清楚了其余部分,但它是尤其是这一步,目前让我退缩了。

到目前为止我为尝试解决问题所做的工作:

  • 我希望在 iOS 7 中,有一些 Text Kit 可以解决这个问题,但我看到的大多数 Text Kit 示例都集中在 UITextViewUITextField,而不是 UILabel
  • 我在此处看到关于 Stack Overflow 的另一个问题,该问题有望解决该问题,但公认的答案已有两年多历史,并且代码在属性文本中表现不佳。

我敢打赌,这个问题的正确答案涉及以下其中一项:

  • 使用标准的 Text Kit 方法在一行代码中解决这个问题。我敢打赌它会涉及 NSLayoutManagertextContainerForGlyphAtIndex:effectiveRange
  • 编写一个复杂的方法,将 UILabel 分成几行,并在一行中找到字形的矩形,可能使用 Core Text 方法。我目前最好的选择是拆开@mattt's优秀TTTAttributedLabel ,它有一个方法可以在一个点找到一个字形 - 如果我反转它,并找到一个字形的点,那可能会起作用。

更新:这是一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com