iOS 5 中无效的 MKMapView 区域

Posted

技术标签:

【中文标题】iOS 5 中无效的 MKMapView 区域【英文标题】:Invalid MKMapView region in iOS 5 【发布时间】:2011-11-19 02:41:22 【问题描述】:

ios 5 下,MKMapView 返回无效区域 -- latitude + latitudeDelta/2 超过 100,不应超过 90。

有人见过这个问题吗?

复制步骤:

    创建一个 MKMapView 在 regionDidChangeAnimated 委托方法中记录 mapView.region 尽可能缩小地图并将其拖动到右侧,使视图滚动到顶部/左侧

预期结果: 在 iOS 4 中,mapView.region 是合理的:

lat=2.202047 lon=-67.500000 latDelta=165.698164 lonDelta=225.000000

然而,在 iOS 5 中,mapView.region 超出了范围:

lat=17.978733 lon=-67.500000 latDelta=165.698164 lonDelta=225.000000

纬度应在 -90 到 90 范围内。然而,在 iOS 5 中,lat + latDelta/2 是 100.827815。这是不可能的。虽然我可以将值限制在 +/- 90,但偏移差异会导致我们的叠加层出现问题。

回归: 在 iOS 4.3 中不会发生。在 iOS 5 中经常发生。地图视图的屏幕转储看起来相同,即使中心纬度偏离 15 度。

注意事项: 可以下载项目文件和屏幕转储here。

【问题讨论】:

【参考方案1】:

这似乎是一个适当的解决方法。与其读取 mapView.region 属性,不如调用此方法:

@implementation MKMapView(fixedRegion)

-(MKCoordinateRegion) fixedRegion_

  // this call is broken on iOS 5, as is the region property, so don't use them
  // return( [self convertRect:self.bounds toRegionFromView:self] );

  CLLocationCoordinate2D topLeft = [self convertPoint:CGPointZero toCoordinateFromView:self];
  CLLocationCoordinate2D bottomRight = [self convertPoint:CGPointMake(self.bounds.size.width, self.bounds.size.height) toCoordinateFromView:self];

  MKCoordinateRegion region;
  region.center.latitude = (topLeft.latitude + bottomRight.latitude)/2;
  region.center.longitude = (topLeft.longitude + bottomRight.longitude)/2; 
  region.span.latitudeDelta = fabs( topLeft.latitude - bottomRight.latitude );
  region.span.longitudeDelta = fabs( topLeft.longitude - bottomRight.longitude );
  return region;

@end

现在有人可能会争辩(正确!)这段代码也不是 100% 正确,因为在 lon/lat 中的墨卡托投影的中心值实际上并不是在顶部和底部之间,但因为这与 iOS 4 匹配功能并将值保持在地图的合法范围内,它对我有用。

【讨论】:

【参考方案2】:

通过使用 MKMapView+ZoomLevel 类别,您根本不必费心设置区域。

这里有很好的教程

http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/

http://mayurbirari.wordpress.com/2011/02/07/how-to-access-mkmapkit-in-iphone/

在您执行缩放/捏合操作后尝试加载区域

      -(void) mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated

而不是

        regionDidChangeAnimated.

希望这会有所帮助..:)

【讨论】:

设置 mapView 区域不是问题。用户通过捏合/缩放缩小视图后,我看到了无效区域。 那么你可以限制区域..即用户只能缩小到某个级别。 感谢您的建议,但我在区域中心看到的错误也在低得多的缩放级别。当您完全放大时,它们会更加明显。我需要能够展示至少整个北美,并且它看起来偏离了 10-15 度。奇怪的是,iOS 4.3 中的一切都完美无缺。 您可以进行版本检查并根据它调整您的区域..如果它的 iOS 4.3 很好,或者如果它是 iOS5,那么您可以调整您的屏幕 是的,如果我能弄清楚如何计算掉了多少,那就是我要做的。

以上是关于iOS 5 中无效的 MKMapView 区域的主要内容,如果未能解决你的问题,请参考以下文章

当mapView为3D时,iOS MapKit获取MKMapView的实际可见区域

MKMapView 与其区域属性未对齐

从 MKMapView 找出您所在的区域类型

MapKit 中的无效区域错误

iOS地图的显示(大头针)

如何使用蓝点在我的 MKMapView 上显示我当前的位置和区域?