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 中子视图和 MKMapView 的手势 - 基本 iOS