用户跟踪模式为MKUserTrackingModeFollowWithHeading时,MKMapView不能正确缩放

我用几行代码和两个组件创build了一个testing项目: MKMapViewUIButton 。 我勾选了mapView选项 – Shows user location 。 我还定义了一个button的动作,它将地图缩放到用户位置。

这是来自控制器的代码:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading; self.mapView.delegate = self; } - (IBAction)changeRegion:(id)sender { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.userLocation.coordinate, 200.0f, 200.0f); [self.mapView setRegion:region animated:YES]; } 

非常简单直接,不是吗? 但是当我点击button,我看到奇怪的行为:地图视图缩放到指定的区域,然后返回到原始缩放。 有什么问题? 我怎样才能保持缩放并同时跟踪用户的位置?

我注意到与MKUserTrackingModeFollow跟踪模式类似的行为。

PS我忘了提到这是一个问题,主要是iOS7

从苹果文档:

将跟踪模式设置为MKUserTrackingModeFollow或MKUserTrackingModeFollowWithHeading会导致地图视图将地图放在该位置的中心,并开始跟踪用户的位置。 如果地图缩小,则地图视图会自动放大用户的位置,从而有效地更改当前的可见区域。

如果你想同时调整区域和跟踪用户,我build议你检查位置更新,并相应地调整缩放。

例如:

 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 200.0f, 200.0f); [self.mapView setRegion:region animated:YES]; } 

编辑

不要设置区域,只要设置中心,

 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { [self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES]; } 

并让你的button动作设置缩放,保持相同的中心:

 - (IBAction)changeRegion:(id)sender { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.centerCoordinate, 200.0f, 200.0f); [self.mapView setRegion:region animated:YES]; } 

而且非常重要:不要设置你的地图视图来跟踪用户。 禁用跟踪用户,因为现在你正在跟踪它自己。 我认为默认是MKUserTrackingModeNone