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