2016-12-26 8 views
1

ユーザーの場所でアプリが起動しますが、ユーザーが地図のカメラの更新をその場所に移動するたびに起動します。私はそれを自分の場所にロードしたいが、その場所が動いていても自由に地図をブラウズできるようにする。 Googleマップアプリに表示される動作と同様です。私はviewDidLoad()機能内の場所を収集するためにKVOを使用しています。その行は次のようになります。地図を停止するユーザーの場所の更新を更新する - Google Maps iOS SDK

mapView.isMyLocationEnabled = true 
self.mapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.new, context: nil) 

はここで観察する機能の私のコードです:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 

    guard let update = change, let myLocation = update[NSKeyValueChangeKey.newKey] as? CLLocation else { 
     print("Location not found") 
     return 
    } 

    self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 14) 

} 

それは、上記の基準を満たす作るために変更する必要があるもの。

+0

「myLocation」の値が取得されるとオブザーバを削除できます。そのため、マップ上であなたの位置を一度見つけたら、 'observeValue()'メソッドの最後の 'self.mapView.removeObserver(self)'のようにカメラを再び変更しません。 –

+0

@SunilChauhanこれは私に以下のエラーを与えます:**キャッチされていない例外 'NSInternalInconsistencyException'のためアプリを終了しました。理由: 'クラス値GMS​​MapViewのインスタンス0x101f30160は、キー値オブザーバーがまだ登録されている間に割り当て解除されました。現在の観測情報:コンテキスト:0x0、プロパティ:0x174054940> ) '* * –

答えて

0

上記のSunilの答えの助けを借りて、この問題を解決する方法を見つけました。

Sunilは、ユーザーの場所が更新されるたびにobserveValue()が呼び出されることに注意してください。だから、observeValue()にあるコードに基づいて、mapViewというカメラは、ユーザーの場所が更新されるたびに更新されるという意味になります。

私はviewDidAppear()のような別の関数に

self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 14) 

を移動することによって、問題を解決しました。

viewDidAppear()の前に呼び出されたように、なぜ私はviewDidLoad()に移動しなかったのかと聞かれることがあります。アプリは、viewDidLoad()の末尾までユーザーの場所を取得しません。したがって、カメラの宣言をviewDidLoad()の最後に置いても、アプリがユーザーの場所を取得するのに十分な時間はありません。 viewDidAppear()関数でカメラ位置を宣言することで、アプリはユーザの位置を処理して取得するのに十分な時間を与えます。

ノートviewDidAppear()で使用するobserveValue()関数の外から変数を渡すようにしてください。

1

thisヘルパーコードを使用して、ユーザーの位置を取得し、のような目標を設定することができます:あなたはいけない「​​上記のヘルパーのコードを使用したい場合は

CLLocationManager *manager = [CLLocationManager updateManagerWithAccuracy:50.0 locationAge:15.0  authorizationDesciption:CLLocationUpdateAuthorizationDescriptionAlways]; 
    [self.manager startUpdatingLocationWithUpdateBlock:^(CLLocationManager *manager, CLLocation *location, NSError *error, BOOL *stopUpdating) { 
    self.mapView.camera = GMSCameraPosition.camera(withTarget: location.coordinate, zoom: 14) 
}]; 

、そしてあなたにも、ユーザの位置using Core Location basic apiを得ることができます。

コードは、ユーザーの場所が変更されるたびにobserveValueと呼び出されます。その結果、ユーザーのロケーションマップ用にカメラが設定されます。

関連する問題