1

UIViewをサブクラス化し、touchesBegan、touchesMoved、touchesEnded、およびdrawRectメソッドをオーバーライドして、ユーザーが画面にタッチして描画できるアプリを作成しました。Quartz2Dライブラリを使用して描画を行っています。

touchesBegan、touchesMoved、およびtouchesEndedでは、タッチイベントの現在お​​よび以前の場所を追跡します。タッチが移動するたび、およびタッチが終了するたびに、下にある描画を保持するために、タッチの前と現在の位置を含む最小の長方形を使用してsetNeedsDisplayInRectを呼び出します。(すべての図面をレイヤーのように相互に追加してほしい。)

奇妙なアーティファクトに気づきました。別の図面と重なる図面を作成すると、QuartzはsetNeedsDisplayInRectに渡された長方形を再描画しますが、その長方形の下のすべてを消去します。

この問題はブレンディングモードが原因であると思われますが、さまざまなブレンディングモードを試してみたところ、うまくいかなかったようです。

基になるコンテンツを保持するパスを描画するにはどうすればよいですか?

4

1 に答える 1

1

クォーツはキャンバスモデルではありません。以前のループで何が描画されたかを追跡しません。呼び出されるたびdrawRect:に、渡された長方形のすべてのピクセルを処理するのはあなたの責任です。デフォルト(で設定UIView clearsContextBeforeDrawing)では、Quartzが長方形をクリアしますが、毎回コンテンツを描画するのはあなたの仕事です。

モノをレイヤー化する場合は、各モノを独自のCALayerまたはに配置するか、が呼び出されるUIViewたびにオーバーラップを再描画する必要があります。drawRect:

于 2012-04-08T20:12:45.680 に答える