1

Text Kit と UIPageViewController を組み合わせて本を作成しています。元のテキストはテキスト ファイル (.html) に保存され、NSTextStorage に配置されます。

[NSLayoutManager addTextContainer:(NSTextContaner*)txt] メソッドはうまく機能しますが、NSLayoutManager が最後の NSTextContainer をいつ満たしたかを知る方法はありません。次のすべてが表示された後でも NSTextContainer を返し続けるだけです。その結果、NSLayoutManager が完了すると、すべてのバンク ページが取得されます。

[NSLayoutManagerDelegate didCompleteLayoutForTextContainer: atEnd:] コールバック メソッドを使用してみましたが、正しく動作しません。最後の NSTextContainer が満たされたときだけでなく、各 NSTextContainer が満たされた後に atEnd flag = YES を返します。UITextView.scrollable = NO (他の場所で推奨) を設定しましたが、それは役に立ちません。

また、テキストが表示されていないときに UITextView.text を呼び出してテキストを確認しようとしましたが、そのメソッドは常に NSTextContainer/NSLayoutManager の背後にある NSTextStorage 全体の内容を返します。

最後のコンテナがいついっぱいになるかがわからない場合、すべてのページがいつレイアウトされるかわかりません。UITextView をテストして空か NSContainer かどうかを確認する方法、または NSLayoutManager でテキストのレイアウトが完了したことを確認する方法はありますか?

4

2 に答える 2

1

コールバックメソッドを正しく呼び出すことができませんでした-バグだと思います-しかし、次のコンテナが空になるかどうかを確認する方法を見つけました..

    [_layoutManager addTextContainer:textContainer];
    NSRange range = [_layoutManager glyphRangeForTextContainer:textContainer];
    if (range.length == 0) {
        return nil;// top adding container because this last one is empty
    }
于 2014-02-05T03:03:53.707 に答える
0

glyphRangeForTextContainer メソッドを呼び出して、コンテナーが最後かどうかを確認します。グリフの数を超えた場合、それが最後のコンテナーです。

layoutManager.addTextContainer(container)

let glyphRange = NSMaxRange((layoutManager.glyphRangeForTextContainer(container)))
if glyphRange >= layoutManager.numberOfGlyphs {
    // last container
}
于 2015-12-05T16:23:39.617 に答える