読者です 読者をやめる 読者になる 読者になる

sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

1.4系の Google Maps SDK for iOS で 現在位置をフォローするマップを表示する

1.4.3もリリースされたことですし、for iOSなGoogleMapsSDKを初めて実案件で使う記念に、iOS版のコードも載せておこうと思います。

iOSではまだまだ修行が足りない身のため、いろいろヘボな処理をしているかもしれませんが、その辺は多目にみてやってください。

ちなみにAndroid版は↓

201308版 Google Maps Android API v2で現在位置をフォロー (MapFragmentまるごと手抜き公開) - sos の 作業メモ

作るもの

モーダルで呼び出せるGoogleMapsSDKを使った地図。

現在位置の測位とそれをマップ中心にし続けるフォロー動作と、ユーザーがジェスチャーで操作したときにフォローモードを解除する機能を実装する。

方針

UIViewControllerのサブクラスで、インターフェースはxibで設計。MapViewはInterfaceBuilderでは貼り付けられないので、プレースホルダーとしてUIViewを貼っておき、ロード時にこのViewの上にMapViewのインスタンスを被せることにする。

現在位置はmyLocationEnableをYESにしてMapView側で取得。KVOで"myLocation"を監視してその更新通知からカメラ移動等の処理を行う。

FollowMapViewController.xib

見ての通り、UINavigationBarと閉じるボタン、プレースホルダーのUIViewを配置。閉じるボタンのActionでpushedClose, プレースホルダーのOutletで placeHolderViewも紐付けている。

f:id:sos_jp:20130831052633p:plain

MapViewのmyLocationEnabledをYESにすれば、CLLocationManagerから勝手に現在位置をとるようになりますので、あとはKVOでmyLocationの値が更新された時にcameraを動かしてやるだけでフォロー動作が実現できます。

フォロー解除を判定するために、GMSMapViewDelegate 以下のメソッドを定義します。

  • ー (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture
  • ー (void)mapView:(GMSMapView )mapView idleAtCameraPosition:(GMSCameraPosition )position

上はカメラの位置が変わる直前に呼ばれるもので、ユーザーがジェスチャーで画面動かしたかどうかが取れるので便利。(コンパスやMyLocationボタンを押した時はジェスチャーではないのでこの引数はYESにはなりません)

下はアニメーションでのcameraの位置の変更が完全に終わった時に呼ばれるもの。ここでmyLocationとマップのセンター(カメラの現在位置)を比べる事で、フォローモードにするかどうかを判定しています。

ここではポートレイト固定を前提にしていますが、プレースホルダーのframeに合わせる処理を追加すればランドスケープでも対応できるようになるはず。


ということで、iOS版もかなり簡単に実装可能です。ここには書いていませんが、AppDelegateでGMSServicesにAPI Keyを設定してやるのを忘れないでください。

その辺りの話しは

その2: Getting Started (Google Maps SDK for iOS) - sos の 作業メモ

を参照してください。