0

たとえば、iOS アプリの場合、ユーザーが画面上で指をスライドさせると、50,000 ドットが記録されます。でこれらすべてのドットの描画が完了した場合drawRect、次にユーザーがtouchesMoved次の行の最後にある 50,001 番目のドットに触れたとき

[self.view setNeedsDisplay];

drawRect再び実行され、50,001 個のドットすべてが再び描画されます。したがって、1 つの新しいドット (指の新しい動き) ごとに、50,001 個のドットすべてを再描画する必要があり、効率的な方法ではありません。

で最後のドットを描画しようとしましたdrawRectが、既存のビューに「追加」するのではなく、「すべてを消去」してから1つのドットを描画します。

する方法はありますか

1) 呼び出す必要なく、その 1 つの余分なドットを描画しdrawRectますか?
2) または、drawRect最初に画面全体を消去せずに余分なドットを 1 つ描画できますか?

4

2 に答える 2

1

メソッドを見てください-(void)setNeedsDisplayInRect:。ビューにそれ自体の指定された四角形を再描画するように要求できますがdrawRect:、渡された四角形引数がビューの四角形全体の一部であり、おそらく描画ロジックが異なると仮定する必要があるメソッドを実装するときは注意してください。clearContextBeforeDrawingまた、UIViewのプロパティを考慮することもできます。

于 2012-04-21T08:21:27.847 に答える
1

これに対する 1 つのアプローチは、タッチが終了したときにイメージにレンダリングし、さらにパスが生成されるたびにイメージに追加し続けることです。必要に応じてパスを配列に保存し、バッファを元に戻すか、または図面を再生成する必要があります。

(明らかに、これよりも多くのコードが必要になります)

 UIGraphicsBeginImageContextWithOptions(size, NO, 1.0);
 CGContextRef context = UIGraphicsGetCurrentContext();
 // do some drawing
 UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

setNeedsDisplayInRect:ああ、fwiw、 iOS5 で奇妙/バグがあることがわかりました。それへの最初の呼び出しは、パラメータとして渡された四角形ではなく、完全なビュー四角形です。少なくともそれは私がそれを使用しようとしたときに見つけたものです. たぶん、私が見落としたいくつかの実装の詳細があります。

于 2012-04-21T08:31:33.230 に答える