1

私はこのイメージを持っています:

ここに画像の説明を入力

私がやりたいことは、この画像に UITapGestureRecognizer を追加することです (または、画像を構成するさまざまな部分に分割し、各部分に UITapGestureRecognizer を追加して、タップされた葉に応じてさまざまなアクションを実行することができます)。画像を葉ごとに異なる画像に分割すると、UIImageViews がおそらく重なり、1 つをタップすると別の画像をタップしたものとして認識されます。画像が 1 つだけあるということは、別の葉ではなく葉に属する画面のポイントを知っていることを意味します。

それを行う方法についての手がかりは本当にありがたいです。ありがとう

4

3 に答える 3

2

ジェスチャ レコグナイザーの を調べて、動作を変更しますlocationInView:

画像を 1 つの単位として処理する場合は、ジェスチャ認識エンジンのコールバックにこれを実装して、タップされた「葉」 (存在する場合) を決定します。

画像を複数の画像として処理する場合は、コールバックに実装することもできますし、デリゲートなどに実装して、gestureRecognizerShouldBegin:描かれた葉の外側のタッチのイベントを抑制することもできます。

編集: ポイントがリーフ内にあるかどうかを判断するための支援も求めている可能性があることに気づきませんでした。@PhillipMills はこの点で正しいです。画像をどのように描画しているかを知る必要があります。

フォローアップ: これは、私の専門分野とは少し異なります。

(ヒット テストの観点から)最も簡単な方法は、Quartz の描画とCGPathContainsPoint(). PNG としてレンダリングする必要がある詳細なグラフィックスがある場合は、ヒット テストを可能にするために (仮想的に) オーバーレイされる単純なパスを作成できます。

あなたの他のオプション、AFAIKは、数学的にヒットテストを行うことですが、基本的に再実装しますCGPathContainsPoint()が、パスはありません。または、タッチポイントのピクセルの色を見てヒットテストを行うさまざまなトリックを採用します。このルートを使用すると、グーグルで検索するといくつかの有用な結果が得られますが、正直なところ、描画したものと同じくらい単純な形状の場合は、いくつかのコードを使用してUIBezierPathコードで再作成するだけです.

于 2012-04-04T16:40:05.277 に答える
1

これが役立つかどうかはわかりませんが、どのリーフがクリックされたかがわからない場合は、CD-ROMプロジェクトで使用していた古い画像マップのトリックを使用して、画像のピクセル精度のクリック追跡を行うことができます。

フルサイズの画像があります。25%(またはそれ以下)のスケーリングバージョンを作成します。クリックを追跡する各葉の領域を異なる色で塗りつぶします。無視したいものはすべて黒くします。フルサイズの画像をクリックしたら、x / y座標を取得し、拡大縮小した画像のパーセンテージで拡大縮小します。次に、スケーリングされたx/y座標でスケーリングされた画像のピクセルカラーを取得します。ピクセルの色を決定することにより、どの葉がクリックされたかがわかります。

不格好に聞こえますが、それは本当にうまく機能し、高速です。

(とはいえ、画像のアルファ領域がジェスチャレコグナイザーをトリガーするとは思わないので、画像を分割することはそれほど複雑ではなく、コード集約的ではありません。)

于 2012-04-04T18:09:07.700 に答える
0

形状を構成要素に分解できる場合は、それぞれを独自のレイヤーに配置し、このスタックオーバーフローのディスカッションで説明されている方法を使用して、どれが触れられたかを判断できます: CALayer コンテンツのアルファ プロパティを使用した CALayer によるヒット テスト

于 2012-04-04T18:01:32.630 に答える