如何将MapView缩放到位置,直到出现第二个时间视图

时间:2013-06-04 23:58:47

标签: ios zoom mapkit

我有一个应用程序,可以加载带有3个标签的tabbarcontroller。其中一个是mapview。它被设置为通过以下代码放大用户的位置:

- (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];
    }
}

初始选项卡是用于用户首选项的tableviewcontroller,第二个选项卡是mapview,第三个选项卡是tableview。当我第一次点击地图视图时,地图显示整个世界:)如果我点击回到初始标签或列表标签,然后返回到地图视图,地图就会正确地围绕我当前的位置。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

在地图视图上设置showsUserLocation将开始搜索用户的位置。这是一个异步操作,您不能认为mapView.userLocation在设置showsUserLocation之后立即生效为是。

第一次查看时,您要求地图视图开始位置。 mapView.userLocation可能会返回nil。第二次,地图视图可能最终获得了用户位置并成功加载了您的地图区域。这绝对是运气,你不应该依赖你第二次获得位置(它可能会失败,比往常更长)。

当地图视图确定了用户位置时,它将回拨委托方法(MKMapViewDelegate)。您需要像这样实现此委托方法:

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

希望这有帮助。