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
}];