1

したがって、ここで見た複数の回答から、アプリが読み込まれ、うまく機能するときに、ユーザーの位置を中心にしてズームする方法を次に示します。

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    NSLog(@"Did update user location");
    MKCoordinateRegion mapRegion;
    mapRegion.center = mapView.userLocation.coordinate;
    mapRegion.span.latitudeDelta = 0.2;
    mapRegion.span.longitudeDelta = 0.2;

    [map setRegion:mapRegion animated: YES];

}

しかし、このデリゲート メソッドが呼び出されるたびにマップをいじり始めると、ユーザーの場所に戻ってきます。ユーザーの現在地の更新を停止する必要がある場合、これにどのように対処すればよいですか? このコードをビューに配置しようとしましたが、最初のズームと中央を取得するためにロードされましたが、機能しませんか? または、コードを別のマップ キット デリゲート メソッドに入れることもできますが、適切な方法でコードを実行する方法がわからないだけです。他の人はどのようにこれを行うのでしょうか?

4

1 に答える 1

2
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{

ユーザーの位置が変更されるたびに呼び出される mapKit デリゲート メソッドです。これが、すべての呼び出しでマップがユーザーの位置を中心にする理由です。アプリの起動時にユーザーの位置でマップを初期化するためにそれを使用することはできません。

それがviewDidLoadで機能していない場合、その時点でユーザーの場所がまだアプリに認識されていないためだと思います。そこにブレークポイントを置いて、自分の目で確かめてください。

私にとっては、アプリがユーザーの場所に関するデータを取得するときに呼び出されるviewDidLoadにオブザーバーを追加する必要があります

// Check if user authorized use of location services
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) {
    // Add observer
    [self.mapView.userLocation addObserver:self
                                forKeyPath:@"location"
                                   options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
                                   context:NULL];
}

次に

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context;

keyPath の「場所」が呼び出されるまで待ちます。初めてトリガーされると、ビューが読み込まれ、アプリはユーザーの場所を認識します。次に、コードを配置して、マップをユーザーの位置の中央に配置できます。ただし、オブザーバーが複数回呼び出されないように、必ずオブザーバーを削除してください。

[self.mapView.userLocation removeObserver:self
                                   forKeyPath:@"location" context:NULL];
于 2014-03-23T17:35:05.667 に答える