【问题标题】:iOS MKMapView setCenterCoordinate does not honor the exact coordinateiOS MKMapView setCenterCoordinate 不遵守确切的坐标
【发布时间】:2012-05-02 18:51:05
【问题描述】:

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

- (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 不去确切的坐标,如果可能的话,任何方法来确保放大和缩小将具有相同的中心。谢谢。

【问题讨论】:

  • 你在改变 MKMapView 的框架吗?
  • 我不这么认为...我剥离了所有其他与地图视图相关的代码,这应该是唯一剩下的了。

标签: ios mkmapview zooming centering coordinate


【解决方案1】:

您可以将原始“良好”中心坐标保存在 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);
}

【讨论】:

  • 所以我应该保存 (37.785826,-122.406406),坐标地图视图实际上以而不是我询问的坐标为中心,以确保回到它开始的位置?
  • 是的,将其保存为CLLocationCoordinate2D centerCoordinate 之类的内容,并且每次缩放地图时,将其设置为中心坐标(结合缩放地图所需的任何区域)。
【解决方案2】:

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

【讨论】:

  • 尝试了您的建议。仍然给我 (37.785826,-122.406406)。
  • 我查了这两个坐标,它们似乎相距不到 2m。鉴于手机内置 GPS 的准确性,您可能会发现移动与您的应用无关。
  • 嗨 Craig,GPS 与我的问题无关。我明确要求将中心设置为某个点(37.785834,-122.406417),但没有得到尊重。我必须与这种行为作斗争的原因是,当 setCenterCoordinate 漂移时,在街道 X 上缩小 (setRegion) 然后再放大将使我进入不同的街道 Y,尽管我从未更改中心坐标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2023-03-13
相关资源
最近更新 更多