0

画像のスケールに関係なく、画像上の位置に常に一致するように、画像の形状に沿ってパスを描画する必要があります。これは、通りの名前と道路が航空写真の上に重ねられた Google マップのハイブリッド ビューのようなものだと考えてください。

さらに、このパスはユーザーの指の動きによって描画されるため、画像のピクセル座標でパスのキーポイントを取得できる必要があります。ユーザーは、パスの場所をより正確に設定するためにズームインします。

私は何とかこのアプローチを使用してそれを機能させることができました:

- タッチ インタラクションを処理し、スケーリング、回転、変換値をフラグに応じて UIImageView または PathsView (以下を参照) に配信する CanvasView と呼ばれるカスタム UIView を作成します。

-基本イメージを保持する UIImageView を作成します。これは CanvasView の子として設定されます

- 2D パス ジオメトリを追跡し、カスタム drawRect でそれ自体を描画する PathsView というカスタム UIView を作成します。これは、UIImageView の子として設定されます。

階層: CanvasView -> UIImageView -> PathsView

このように、deliverToImageOrPaths が YES の場合、指のジェスチャーは UIImageView とその子 PathsView の両方を変換します。deliveryToImageOrPaths が NO の場合、ジェスチャは PathsView のみに影響を与え、ジオメトリを変更します。ここまでは順調ですね。

質問: 私が抱えている問題は、ベース UIImageView を (その .transform プロパティを介して) スケーリングすると、PathsView がエイリアシング アーティファクトでスケーリングされることです。drawRect は PathsView でまだ呼び出されていますが、元のバッファー サイズを使用して描画を実行してから補間していると思います。

この問題を解決するにはどうすればよいですか? これらの機能を実装するためのより良い方法はありますか?

PS: PathsView レイヤー クラスを、levelsOfDetailBias 4 と levelsOfDetail 4 を使用して CAtiledLayer に変更してみました。これにより、エイリアシングの問題はある程度解決されますが、レンダリングが許容できないほど遅くなります。

4

2 に答える 2

0

パス値が描画されているときに保持している場合は、下にある画像の % スケーリングをキャプチャしてから、パス値を再配置し、PathsView の drawRect メソッドで再描画できます。

少し計算が必要になりますが (主にマップ投影の線に沿って)、ビットマップをスケーリングしてアーティファクトを取得する代わりに、ポイントの距離をスケーリングし、ベクトルを使用して再描画します。これにより、任意の解像度で滑らかになります (特にピクセルや線の代わりにベジエでドットを接続します)。

ユーザーがパスを描画するときにパスに沿ってペイントを配置し、ポイント データを破棄する場合、唯一の解決策はビットマップ アンチエイリアシングを実行することです。スロー。

于 2009-10-02T23:33:55.963 に答える
0

iPhone OS 3.0 以降をターゲットにしている場合はCAShapeLayer、パスに a を使用できます。レイヤーに CGPathRef を割り当てると、すべての描画とスケーリングが処理されます。レイヤーの変換を設定するだけです。

于 2009-10-30T00:06:36.267 に答える