13

我用几行代码和两个组件创建了一个测试项目:MKMapViewUIButton. 我勾选了mapView选项 - Shows user location。我还为按钮定义了一个动作,它将地图缩放到用户位置。

这是来自控制器的代码:

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

非常简单明了,不是吗?但是当我点击按钮时,我看到了奇怪的行为:地图视图缩放到指定区域然后返回到原始缩放。有什么问题?如何同时保持缩放和跟踪用户位置?

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

PS我忘了提到这主要是iOS7的问题

4

1 回答 1

12

来自苹果文档:

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

如果您既想调整区域又想跟踪用户,我建议您检查位置更新并相应地调整缩放。

例如:

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

并让您的按钮操作设置缩放,保持相同的中心:

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

并且非常重要:不要将您的 mapView 设置为跟踪用户。禁用跟踪用户,因为现在您正在自己跟踪它。我认为默认是MKUserTrackingModeNone.

于 2013-10-22T12:52:13.780 回答