我想通过使用UIPageViewController和我的CustomTextViewController来实现像“Kindle App”一样的工具ViewControllers。
但我无法找到适合特定rect的NSAttributeString子串的方法。
这是截图。
在这种情况下,最后一行不可见!!
子串(“早期之前〜大多数计算机选择不”)是正确的字符串大小。
如何获取子字符串或子字符串的最后一个索引(可见行的最后一个字符索引,“o”在最后一个单词“to”中)
答案 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
}];