iOS MKMapView setCenterCoordinate 不遵守确切的坐标

Posted

技术标签:

【中文标题】iOS MKMapView setCenterCoordinate 不遵守确切的坐标【英文标题】:iOS MKMapView setCenterCoordinate does not honor the exact coordinate 【发布时间】: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 的框架吗? 我不这么认为...我剥离了所有其他与地图视图相关的代码,这应该是唯一剩下的了。 【参考方案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,尽管我从未更改中心坐标。

以上是关于iOS MKMapView setCenterCoordinate 不遵守确切的坐标的主要内容,如果未能解决你的问题,请参考以下文章

iOS 5 中无效的 MKMapView 区域

iOS - MKMapView - 可拖动注释

iOS 中子视图和 MKMapView 的手势 - 基本 iOS

MKMapView 在 iOS10 中检测内存泄漏

MapKit (MKMapView):zPosition 在 iOS11 上不再工作

MKMapview 在模拟器的 iOS-7.0 中不显示地图