如何获得适合特定rect的NSAttributedString子串?

时间:2013-03-03 04:16:16

标签: ios objective-c uitextview nsrect

我想通过使用UIPageViewController和我的CustomTextViewController来实现像“Kindle App”一样的工具ViewControllers。

但我无法找到适合特定rect的NSAttributeString子串的方法。

  • 我有一个70,000个字符的NSAttributeString。
  • 我的CustomTextViewController有一个UITextView。
  • 它将显示ATTR_STR_A的子字符串,只是符合它的大小。
  • 这意味着UITextView不必滚动。

这是截图。

Not

在这种情况下,最后一行不可见!!

子串(“早期之前〜大多数计算机选择不”)是正确的字符串大小。

如何获取子字符串或子字符串的最后一个索引(可见行的最后一个字符索引,“o”在最后一个单词“to”中)

1 个答案:

答案 0 :(得分:0)

NSLayoutManager有一种您可能会觉得有用的方法:enumerateLineFragmentsForGlyphRange:usingBlock:。借助它,您可以枚举每行文本,在textContainer中获取文本大小和文本范围。因此,您只需要从属性字符串中实例化NSTextStorage即可。然后,实例化NSTextContainer所需的大小(在您的情况下 - CGSizeMake(self.view.frame.width, CGFLOAT_MAX)。然后连接所有内容并开始枚举。 像这样:

NSTextStorage *textStorage =  [[NSTextStorage alloc] initWithAttributedString:attrString];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(self.view.frame.width, CGFLOAT_MAX)];
NSLayoutManager *layoutManager = [NSLayoutManager new];

[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];

NSRange allRange = NSMakeRange(0, textStorage.length);

//force layout calculation
[layoutManager ensureLayoutForTextContainer:textContainer];

[layoutManager enumerateLineFragmentsForGlyphRange:allRange usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer * _Nonnull textContainer, NSRange glyphRange, BOOL * _Nonnull stop) {
    //here you can do anything with the info: bounds of text, text range, line number etc
}];