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も紐付けている。
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 の 作業メモ
を参照してください。