2009-08-02 13 views
1

私は都市を描いた円と四角の束で静的な地図画像を持っている。私はscrollViewの下にサブクラス化されたimageViewにイメージをロードして、ユーザーのタッチをキャプチャしてマップ全体をズーム/スクロールすることができます。私が挑戦しているのは、ユーザがこれらのサークル/スクエアのいずれかに触れて、それがどの都市にあるかを伝えたり、都市の詳細ビューをロードしたりするたびに、ラベルをポップアップしたいということです。私は、 "touchesBegan"イベント中にそれらを参照できるように、imageViewマップに基づいて都市の相対CGPointsをすべて事前にロードできると思っていましたが、すぐに私の頭の中に入り、おそらくこれについて間違った道。iPhoneが地図画像に触れている。

これまでのところすべてが機能しており、タッチのCGPoint x座標とy座標を取得できます。私が持っている最大の問題は、ユーザーが辞書の中にある離散点に近づいていることを判断することです。つまり、辞書に「Boston = NSPoint:{235、118};」と表示されている場合、ユーザーが正確になるまでタッチを繰り返さずに、ユーザーがそのポイントに近づいたことをどのようにして知ることができますか?ユーザーのタッチが既存のポイントに「近い」かどうかを判断する簡単な方法はありますか?私はこれについて正しいことをしていますか?

頭の後ろにあるアドバイスや叩きは大歓迎です。

おかげで、マイク

答えて

0

UIButtonを使用して都市を表すことができます。その後、標準的なタッチ、ハイライトなど、少ない労力で行動を得ることができます。マップ上にサブビューとしてボタンを追加すると、それらのボタンが地図とともに拡大縮小され、スクロールされます。

+0

私はそれについて考えましたが、50+都市点を考えれば、非常に多くのオブジェクトを宣言/管理するのは夢中になります。しかし、応答ありがとう - マイク。 –

+0

狂っているように見えるかもしれませんが、あなたは辞書を繰り返して、都市のポイントを引き出し、15px x 15pxの新しいボタンを作成し、次に都市のポイントでsetCenterを作成します。あなたがする必要があるもう1つの方法は、ボタンをメソッド(addTarget:action:forControlEvent :)に接続し、どのボタンがどの都市に対応しているかを確認する方法です。その1つの方法は、ボタンのタグプロパティを配列の都市のインデックスに設定することです。 –

+0

デーヴありがとう、それは基本的に私がやったことです。私はコンパイルif文比較(+/- 10)を行っている点の辞書を繰り返し、そして許容範囲内の点を見つけると、辞書から市の名前を引いて、都市名とユーザー操作用のボタンがいくつかあります。 - ありがとうございました。マイク –

0

あなたはR-Treeを使用するか、現在のビュー内の各表示ポイントにタッチの近接性を計算することができます。近接度を計算するには、通常ピタゴラスの定理を使用しますが、この場合、相対的なサイズだけを比較しているので、平方根をスキップできます。また、距離のカットオフを宣言することもできます。たとえば、50ピクセルの2乗から2500までの距離を宣言することができます。距離と参照点を含むオブジェクトに結果を入れ、カットオフの下に結果を追加せずにオブジェクトをNSMutableArrayに配置します。最小結果を選択します。

あなたはタッチ点pTを持っているのであれば、その後、各点pNのために、あなたは計算したい:最小d

d=(pT.x-pN.x)*(pT.x-pN.x) + (pT.y-pN.y)*(pT.y-pN.y); //d is the squared distance 

ポイントpNpTに最も近かったポイントです。そして、あなたが10ピクセル以内に数えて触れることだけを望むなら、私は言ったように、あなたはそれをテストすることができますd <= 10*10;

2つの点が互いに20ピクセル以内にある場合を除いて、20×20の正方形領域内の接触をテストする方法も同様に機能します。次に、どれが最も近接した接触点であるかを知る必要があります。

+1

アドバイスをいただきありがとうございますが、私は辛抱強くピタゴラスを綴ることができますが、それは分かりません。あなたは明らかにスマートな子供の一人であり、私は数学をスキップしたダミーのひとりでした。私の犬を歩いて私の頭をはがした後、私は実際にタッチのxとyの座標を保存されている都市xとyの座標+/- 10点の辞書と比較するソリューションを考えました。 if((touchPoint.y> =(mapPoint.y -10)&& touchPoint.y <=(mapPoint.y + 10)) \t \t \t &&(touchPoint.x> =(mapPoint.x -10)&& touchPoint.x <=(mapPoint.x +10))){ //何かを実行 } マイクに応答する時間をとってくれてありがとう。 –

0

正しく理解すれば、ユーザーがタップしたポイントが都市としてマークされているポイントに十分近いかどうかを知りたいと思っています。

しきい値を設定しなければならない、つまりしきい値を設定してから、タップが遠くなる前に、タップが近くになります。

これを行うと、配列内の各要素(都市のx、y値を持つ読み込み辞書)の直交座標距離sqrt((x1-x2)^ 2 +(y1-y2)^ 2) を計算します結果を別の配列に格納します。結果の最小値をとってください。その結果の指標は、前記閾値よりも小さい場合、タップに最も近い都市である。

関連する問題