0

3 つのタブを持つ tabbarcontroller を読み込むアプリがあります。それらの1つはマップビューです。次のコードによって、ユーザーの位置にズームインするように設定されています。

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    _mapView.showsUserLocation = YES;

    CLLocationCoordinate2D zoomLocation;

    //IF no city was selected, use userLocation as center
    if (!self.cityWasSelected) {
        zoomLocation.latitude = self.userLocation.coordinate.latitude;
        zoomLocation.longitude = self.userLocation.coordinate.longitude;

        CLLocationDistance visibleDistance = 5000; // 5 kilometers
        MKCoordinateRegion adjustedRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, visibleDistance, visibleDistance);


        [_mapView setRegion:adjustedRegion animated:YES];
    } else { //if a city was selected, use that city's value...this is actually the same right now, since self.userLocation is set appropriately elsewhere.
        //Set location from selection - forward geocode
        zoomLocation.latitude = self.userLocation.coordinate.latitude;
        zoomLocation.longitude = self.userLocation.coordinate.longitude;

        CLLocationDistance visibleDistance = 5000; // 5 kilometers
        MKCoordinateRegion adjustedRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, visibleDistance, visibleDistance);

        [_mapView setRegion:adjustedRegion animated:YES];
    }
}

最初のタブはユーザー設定用のテーブル ビュー コントローラーで、2 番目のタブはマップ ビュー、3 番目のタブはテーブル ビューです。マップビューを最初にタップすると、マップに全世界が表示されます:) タップして最初のタブまたはリストタブに戻ってからマップビューに戻ると、マップは現在の場所を中心に適切に配置されます。

なぜこれが起こるのですか?

4

1 に答える 1

0

マップ ビューで設定showsUserLocationすると、ユーザーの場所の検索が開始されます。これは非同期操作であり、YESmapView.userLocationに設定した直後に有効になるとは想定できません。showsUserLocation

ビューが初めて表示されたときに、マップ ビューに開始位置を尋ねます。mapView.userLocationおそらくnilを返します。2 回目では、マップ ビューはおそらく最終的にユーザーの位置を取得し、マップ領域を正常に読み込みます。これはまったくの運であり、2 回目に位置情報を取得できるとは限りません (失敗する可能性があり、通常よりも時間がかかります)。

マップ ビューがユーザーの位置を特定すると、デリゲート メソッド ( MKMapViewDelegate )でコールバックします。このデリゲート メソッドを次のように実装する必要があります。

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    // We have location, do your logic of setting the map region here.
    ...
}

お役に立てれば。

于 2013-06-05T00:27:33.737 に答える