1

当按下定位按钮时,我有以下代码以用户的当前位置为中心:

- (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), but got (37.785826,-122.406406)”

这意味着 setCenterCoordinate 移动到近似坐标而不是指示的坐标。这非常不方便,因为当我实现缩放级别时,在同一位置缩小然后再放大(因为 setRegion 也会更改中心坐标)将从旧位置移开。这是违反直觉的,Android 平台 API 不会表现出这种不稳定的行为。

有人可以解释为什么 setCenterCoordinate 不去确切的坐标,如果可能的话,任何方法来确保放大和缩小将具有相同的中心。谢谢。

4

2 回答 2

4

您可以将原始的“良好”中心坐标保存在 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);
}
于 2012-04-23T11:10:18.537 回答
0

setCenterCoordinate 中的最后一个参数是“动画”。您将其设置为“是”,因此可能需要一秒钟左右才能到达正确的位置。由于这发生在另一个线程上,因此 NSLog 行发生在地图到达目标坐标之前。在阅读中心之前等待一两分钟,或者通过屏幕上的按钮激活您的 NSLog 语句,这样您就可以确保在地图停止移动后执行此操作。

于 2012-04-22T06:00:52.143 回答