4

UIPageViewControllerとCustomTextViewControllerを使用して、「Kindleアプリ」のように動作するViewControllersを実装したいと思います。

しかし、特定のrectに適合するNSAttributeStringのサブストリングを取得する方法を見つけることができません。

  • 70,000文字のNSAttributeStringがあります。
  • 私のCustomTextViewControllerには1つの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 に答える