私は多くのことを試みてきましたが、まだ解決策が見つかりません。iOSでペイントと消去を実装する必要があるため、を使用してペイントロジックを正常に実装しましたUIBezierPath
。問題は、消去の場合、を使用してペイントの場合と同じロジックを実装したkCGBlendModeClear
ことですが、問題は、消去された領域に再描画できないことです。これは、drawRectの各パスで、ペイントパスと消去パスの両方をストロークする必要があるためです。とにかく、描画パスから消去パスを差し引いて、結果のパスを取得し、それをストロークすることができます。私はCoreGraphicsを初めて使用し、返信とコメントを楽しみにしています。または、同じものを実装するための他のロジック。背景にテクスチャがあるため、消しゴムを背景色として使用できません。
2 に答える
毎回パスをストロークする必要はありません。実際、そうすることはパフォーマンスに大きな打撃を与えます。iPad 3で試してみると、数回のストロークでほとんど反応しない画面が表示されることを保証します。パスを追加してストロークする必要があるのは1回だけです。その後、ピクセルデータとして保存されます。したがって、ストロークを追跡するのではなく、ストロークを追加してストロークし、削除するだけです。また、CGLayerの使用も検討してください(メインループの外側に描画し、メインループのrectにのみレンダリングできるため、多くの時間を節約できます)。
これらは私が使用する手順であり、まったく同じことを行っています(UIBezierPathの代わりにCGPathを使用していますが、考え方は同じです)。
1)タッチ開始時に、タッチポイントを保存し、ユーザーが選択した内容に応じて、コンテキストを消去または描画のいずれかに設定します。
2)移動したタッチで、ポイントが最後のポイントから任意の距離にある場合は、最後のポイント()に移動し、myCGContextMoveToPoint
の新しいポイント()に線を引きます。変更された(つまり、2つのポイントを含む)長方形を計算し、その長方形で呼び出します。CGContextAddLineToPoint
CGLayer
setNeedsDisplayInRect:
3)drawRectで、CGLayer
を現在のウィンドウコンテキストにレンダリングします(UIGraphicsGetCurrentContext()
)。
iPad 3(膨大なピクセル数のために誰もが最も問題を抱えているもの)では、このプロセスはレンダリングごとに0.05ミリ秒から0.15ミリ秒かかります(スワイプの速さによって異なります)。ただし、注意点が1つあります。適切な予防策を講じないと、setNeedsDisplayInRect:
これに対抗するための私のハッキーな方法(開発フォーラムのおかげで)のみを使用した場合でも、フレームの長方形全体が再描画されます。そうしないと、ビューがフレーム全体を描画するのに長い時間がかかる場合(私の場合、許容できない150ミリ秒かかりました)、ビューバッファーが再作成される間、特定の条件下で短いスタッターが発生します。
編集あなたのコメントからの新しい情報で、この質問への答えはあなたに利益をもたらすようです-> iPhoneアプリでアルファマスクとしてCoreGraphicStrokeを使用してください
ここにあるHaiは、ペイント、消去、元に戻す、やり直し、画像として保存するためのコードです。サンプルコードを確認して、プロジェクトに実装できます。 ここ