プログラム(22): iOSアプリ15 – 簡易地図アプリの苦悩

 これまでにリリースしたiOSアプリをいくつかご紹介しました。最近2回は、日本地図とアメリカ地図についてのご紹介をしました。この2つのアプリは、扱っているデータは異なりますが、機能はほぼ同じです。日本地図では都道府県名・県庁所在地名・地図上の位置を、アメリカ地図では州名・州都・地図上の位置を揃えるアプリです。

 アプリ作成時に最も苦労したのは、地図上の位置を指定する方法です。都道府県(アメリカの州)の形の小さな画像をデータとするピッカーを作成して、このピッカーで選択する様にしました。アプリの画面では、ピッカーは3つありますが、一番右側のピッカーをくるくる回転させて、地図上での場所を選択させるわけです。アプリ画面下部にある地図は、ピッカーで選択された都道府県(州)のみ着色するようにすれば、地図上の場所をしていできます。

 ただ、都道府県(アメリカの州)は50個程度あるので、ピッカーをクルクル回して自分の思う場所を指定するのが大変面倒です。やはり、アプリ下部の地図をタップして、そのタップした場所が選択される様になる、というのが自然な挙動です。ということで、そのような動作をコーディングしたいと思いました。「地図をタップしてその場所の都道府県(アメリカの州)を選択する」、言葉で書けば簡単ですが、コーディングはなかなか大変でした。どうすれば良いと思いますか?

 iOSアプリには「ボタン」という部品があります。「ボタン」は、そこを押すとあらかじめ決められた機能が実行できる領域のことで、アプリ画面にある「設定」も「ボタン」です。ということで、地図をボタンとして定義すれば所望の機能が実装できそうです。ボタンは、もともと「自分がタップされたら〜を実行せよ」という機能が実装されています。これを、「自分の〇〇の箇所がタップされたら、その場所に従って〜を実行せよ」というふうに変更してやる必要があります。

 ボタンの機能、特にタップされた時の挙動を上書きすれば良いのです。iOSアプリの場合は、UIButtonというクラスを使います。タップされた時の挙動はhitTestという関数に書かれています。おおもとのhitTestはタップされた位置情報をその後の動作に使わないのですが、それを次の様な感じに変更してやれば良いわけです。

 ボタンがタップされた —> タップされた場所の座標が都道府県(アメリカの州)の何番目の中にあるか調査 —> 新たにタップされた場所を着色 —> それまで着色していた場所を透明に —> アプリで必要なその他の機能を実行

 上記のフローの中で2番目の、「タップされた場所の座標が何番目の都道府県(アメリカの州)の中にあるか調査」も、色々と実装方法が考えられて結構難しい部分です。この部分は機会があればまた別の場所で書きたいと思います。

コメントを残す

メールアドレスが公開されることはありません。