質問
都市を表す円と正方形の束を含む静的な地図画像があります。 scrollViewの下にサブクラス化されたimageViewに画像をロードしました。これにより、ユーザーのタッチをキャプチャし、マップ全体をズーム/スクロールできます。私の課題は、ユーザーが都市のこれらの円/正方形のいずれかに触れるたびにラベルをポップアップして、都市を教えて、都市の詳細ビューを読み込むことです。 imageViewマップに基づいて都市のすべての相対的なCGPointsを辞書にプリロードして、<!> quot; touchesBegan <!> quot;の間に参照できるようにすると考えました。イベント、しかし、私はすぐに私の頭に乗り込み、おそらくこれについて間違った方法で進んでいます。
これまでのところすべてが機能しており、タッチのCGPoint xおよびy座標をキャプチャできます。私が抱えている最大の問題は、ユーザーのタッチが辞書にある離散点にどれだけ近いかを判断することです。つまり、辞書に<!> quot; Boston = NSPoint:{235、118}; <!> quot;がある場合正確になるまでタッチを繰り返させずに、ユーザーがそのポイントに近づいたことをどのように確認できますか?ユーザーのタッチが<!> quot; close <!> quot;であるかどうかを判断する簡単な方法はありますか?既存のポイントまで?私はこれについて正しい方法で行っていますか?
後頭部でのアドバイスや平手打ちを歓迎します。
ありがとう、マイク
解決
UIButtonsを使用して都市を表すことができます。次に、少ない労力で標準のタッチ、ハイライトなどの動作を取得します。マップ上のサブビューとしてボタンを追加すると、マップに沿ってボタンがスケーリングおよびスクロールされます。
他のヒント
正しく理解できたら、ユーザーがタップしたポイントが<!> quot; close <!> quot;かどうかを知りたい都市としてマークされているポイントまでは十分です。
近くを定量化する必要があります。つまり、しきい値を設定した後、タップが遠くなり、その前にタップが近くなります。
それを行ったら、デカルト座標距離sqrt((x1-x2)^ 2 +(y1-y2)^ 2)を計算します 配列内の各要素(都市のx、y値で辞書を読み取る)について、結果を別の配列に格納します。その後、結果の最小値を取得します。その結果のインデックスは、そのしきい値よりも小さい場合、タップに最も近い都市です。
Rツリーを使用するか、近接度を計算できます現在のビューの各表示ポイントへのタッチの。近接度を計算するには、通常ピタゴラスの定理を使用しますが、この場合は相対サイズのみを比較しているため、平方根をスキップできます。また、50ピクセルを2500に2乗したい場合は、距離のカットオフを宣言できます。したがって、結果を距離と参照ポイントを含むオブジェクトに入れ、オブジェクトをNSMutableArrayに入れて、カットオフの下に結果を追加しません。最小の結果を選択します。
したがって、タッチされたポイントpT
がある場合、各ポイントpN
に対して、次の計算を行います。
d=(pT.x-pN.x)*(pT.x-pN.x) + (pT.y-pN.y)*(pT.y-pN.y); //d is the squared distance
最小のd
を持つポイントd <= 10*10
は、<=>に最も近いポイントです。そして、10ピクセル以内のタッチのみをカウントしたい場合に言ったように、<=>;
20x20の正方形領域内のタッチをテストする方法も機能しますが、2つのポイントが互いに20ピクセル以内にある場合は、どちらが最も近いタッチポイントであるかを知る必要があります。