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



我有一个应用程序,加载一个有3个选项卡的选项卡控制器。其中之一是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。当我第一次点击mapview,地图显示了整个世界:)如果我点击回到初始标签或列表标签,然后返回到mapview,地图是正确的中心围绕我当前的位置。

为什么会发生这种情况?

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

第一次出现视图时,要求地图视图开始定位。mapView.userLocation可能返回nil。第二次时,地图视图可能最终获得了用户位置并成功加载了地图区域。这是纯粹的运气,你不应该指望你会第二次获得位置(它可能会失败,花费比平常更长的时间)。

当地图视图确定了用户位置,它会回调一个委托方法(MKMapViewDelegate)。你需要像这样实现这个委托方法:

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

相关内容

最新更新