私はコアテキストを使用してiOSで独自のテキストエディタを作成しています。1つの例外を除いて、ほとんどすべてがうまく機能します。テキストドキュメントが「大きい」場合、スタッフは実際に速度が低下し始めます。私は、iOSが選択の変更を含むすべての変更でドキュメントテキスト全体を要求していることを発見しました(少なくとも、選択の変更をUITextInputDelegateに通知するとき)。問題の一部は、ドキュメントを段落に分割し、変更された段落のみをレンダリングすることで、CoreTextコードをすでに最適化していることです。ただし、これを行うと、ドキュメント文字列(はNSAttributedString
)が個別の「段落オブジェクト」に分割されます。そのため、iOSがテキストドキュメント全体を要求する場合、それらすべての文字列を1つの文字列に結合する必要があり、これには時間とメモリがかかります。
私の解決策は、iOSにとメソッドに誤ったを与えUITextPosition
、beginningOfDocument
それらendOfDocument
の位置を現在の選択と交差する段落に制限することです。これは実際には非常にうまく機能しています。iOSは現在、変更の現在の段落のみを要求しているため、速度低下は完全に解消されています。
これまでのところ、とても良いですが、これが何かを壊すかもしれないのではないかと少し心配しています。私はこれを少しテストしましたが、何も壊れていませんが、テキストエディタはテストするのが難しい場合があります(エッジ状態で壊れるかどうかは誰にもわかりません)。
私は2つの質問があります:
- iOSは、変更のたびにドキュメントテキスト全体を要求する必要がありますか?そうでない場合は、おそらく私の
UITextInput
プロトコルメソッド内の他のメソッドが間違った値を返し、iOSがドキュメント全体を要求する原因になっている可能性があります。 - これが実際に何かを壊すかどうか誰かが知っていますか?