我创建了一个测试项目,其中包含几行代码和两个组件:MKMapView
和UIButton
。我勾选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跟踪模式类似的行为。
P.S。我忘了提到它主要是iOS7的问题
答案 0 :(得分:8)
来自苹果文档:
将跟踪模式设置为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
。