4

我希望通过使用 UIPageViewController 和我的 CustomTextViewController 来实现 ViewControllers,就像“Kindle App”一样。

但是我找不到一种方法来获取适合特定矩形的 NSAttributeString 子字符串。

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

这是一个屏幕截图。

不是

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

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

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

4

1 回答 1

1

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
}];
于 2016-08-23T14:31:43.037 回答