0

ピアノの鍵盤が内部に描かれたカスタムビューがあります。各キーは個別の呼び出しとして描画されるため、再描画が必要なキーのみを描画できます。ビューはマルチタッチをサポートしているため、一度に複数のキーを押し続けることができます。

各キーの描画には多少コストがかかるため、ビュー全体の再描画(顕著な遅延が発生する)を回避するために、ビューでタッチが検出されるたびに特定の領域をsetNeedsDisplayに渡します。

複数のタッチを処理するために、受信したタッチのセットを繰り返し処理し、各タッチがいずれかのキー内にあるかどうかを確認し、含まれている場合は更新して、そのキーの長方形でsetNeedsDisplayを呼び出します。つまり、setNeedsDisplayは、1つの関数で複数回呼び出されますが、毎回異なるrectで呼び出されます。

私が期待した動作は、drawRectが異なるダーティ領域で複数回呼び出されることでしたが、左端と右端のキーを同時に押すと、左端だけでなく、ビュー全体が再描画されるようです。および右端のキー(のように、その間のすべてのキーが不必要に再描画されます)。

私が望むことを達成するために私は何ができますか?2つの汚れたキーの間にあるすべてのキーではなく、触れたキーだけを描画したいと思います。

4

2 に答える 2

3

drawRect:を呼び出した回数に関係なく、システムはメインの実行ループのターンごとに 1 つのメッセージを送信しますsetNeedsDisplayInRect:。渡したすべてのダーティ rect の少なくとも「結合」である rect を渡しますsetNeedsDisplayInRect:。システムは、どの rect が に渡されたかを正確に知る方法を提供しませんsetNeedsDisplayInRect:

オーバーライドsetNeedsDisplayInRect:してダーティな四角形の配列を保持し (+[NSValue valueWithCGRect:]便利だと思います)、 で配列をクリアすることができますdrawRect:

setNeedsDisplayForKey:ダーティ キーと呼び出しの配列を保持する独自のメソッドを作成できますsetNeedsDisplay

于 2012-06-16T02:22:20.797 に答える
1

私はこれに遭遇し、ここに私の質問を投稿しました。

不思議なことに、私はキーボード(88キー)も描いていました。私はそれを解決したことはなく、パフォーマンスの問題であることが判明した場合は対処することにしました(必要になるまで最適化しないでくださいなど)。私がしたことの1つは、起動時に、デフォルトのキーボードを画像にレンダリングし、それをベースとして使用することでした。そのため、キーボード全体ではなく、押されたキーのみを描画していました。CGPathのものよりも高速に画像を描画できます。

MIDIノートを演奏しながら表示していましたが、パフォーマンスは良好でした。したがって、今はこれについて心配する必要はないかもしれません。

于 2012-06-16T01:19:50.307 に答える