当按下定位按钮时,我有以下代码以用户的当前位置为中心:
- (void)locate
{
if (self.curLocation) {
[self.googleMapView setCenterCoordinate:self.curLocation.coordinate animated:YES];
NSLog(@"setting center (%f,%f), but got (%f,%f)", self.curLocation.coordinate.latitude, self.curLocation.coordinate.longitude, self.googleMapView.centerCoordinate.latitude, self.googleMapView.centerCoordinate.longitude);
}
}
NSLog 的输出是"设置中心 (37.785834,-122.406417),但得到 (37.785826,-122.406406)"
这意味着 setCenterCoordinate 移动到近似坐标而不是指示的坐标。这非常不方便,因为当我实现缩放级别时,在同一位置缩小然后放大(因为 setRegion 也会更改中心坐标)将远离旧位置。这是违反直觉的,Android 平台 API 不会表现出这种不稳定的行为。
有人可以解释为什么 setCenterCoordinate 没有转到确切的坐标,如果可能的话,可以确保缩小和缩小具有相同中心的任何方法。谢谢。
您可以将原始的"良好"中心坐标保存在 ivar 中,然后在每次放大时使用它。这样它应该总是回到它开始的地方。我假设您正在使用按钮或通过调用方法进行放大。
中心坐标似乎不可靠。当您放大时,它会变得更加可靠,但它似乎从未完全设置为您的要求。即使使用 regionThatFits:
返回的中心坐标也不会给出完全匹配,而它应该如此。您可以使用-mapView:regionDidChangeAnimated:
进行试验:
- (void)viewDidAppear:(BOOL)animated
{
MKCoordinateSpan span = MKCoordinateSpanMake(0.0001f, 0.0001f);
CLLocationCoordinate2D coordinate = {35.67106,139.764909};
MKCoordinateRegion region = {coordinate, span};
MKCoordinateRegion regionThatFits = [self.mapView regionThatFits:region];
NSLog(@"Fit Region %f %f", regionThatFits.center.latitude, regionThatFits.center.longitude);
[self.mapView setRegion:regionThatFits animated:YES];
// [self.mapView setRegion:region animated:YES];
// [self.mapView setCenterCoordinate:coordinate animated:NO];
}
- (void)mapView:(MKMapView *)myMapView regionDidChangeAnimated:(BOOL)animated
{
NSLog(@"Center: %f %f", myMapView.region.center.latitude,myMapView.region.center.longitude);
}
setCenterCoordinate 中的最后一个参数是"animated"。您将其设置为"是",因此可能需要一秒钟左右才能到达正确的位置。由于这发生在另一个线程上,因此 NSLog 线发生在映射到达目标坐标之前。在阅读中心之前等待一两分钟,或者通过屏幕上的按钮激活您的 NSLog 语句,这样您就可以确保在地图停止移动后执行此操作。