MKMapView setRegion:在世界边缘崩溃

时间:2014-04-16 14:03:43

标签: objective-c mkmapview mapkit core-location

我正在使用此代码设置MKMapView的区域,使其以pin为中心,并缩放以显示大约10公里的区域。

CLLocationAccuracy accuracy = kCLLocationAccuracyKilometer;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(pin.coordinate, accuracy * 10.0f, accuracy * 10.0f);
[self.mapSubView setRegion:region animated:NO];

当运行针脚坐标为纬度-90,经度-58.359001159667969的代码时,生成region,如下所示:

绘制mapSubView时发生崩溃: -

  

由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:'无效区域   < center:-90.00000000,-58.35900116 span:+0.08953039,   + 1462142065660629.00000000>'

我第一次尝试修复此问题是检查“edge”lat / long(-90,+ 90,-180,+ 180),这解决了这个问题。但是,如果纬度变为-89.99999,问题将返回。

我猜这是由于纬度为-90和/或区域跨度的经度delta如此大,导致一个区域有效地“超出了这个世界”:p

关于如何将地图围绕任何坐标固定在地图上的任何建议,显示一个~10km的区域,没有这种崩溃将非常感激。

3 个答案:

答案 0 :(得分:4)

@ supp-f回答是对的

Swift 3 解决方案:

func safeSetRegion(_ region: MKCoordinateRegion) {
    let myRegion = self.mapView.regionThatFits(region)
    if !(myRegion.span.latitudeDelta.isNaN || myRegion.span.longitudeDelta.isNaN) {
        self.mapView.setRegion(myRegion, animated: true)
    }
}

答案 1 :(得分:1)

基于Sergey和supp-f的答案,您还必须检查最大跨度值。

纬度跨度最大值为180.0,经度跨度最大值为360.0

pd.read_html

答案 2 :(得分:0)

我能够重现崩溃。我认为它是SDK中的一个错误。

此测试也会失败,但没有崩溃:

MKCoordinateRegion region;
region.center.longitude = coord.longitude;
region.center.latitude = 90.f;//coord.latitude;
region.span.longitudeDelta = 0.02f;
region.span.latitudeDelta = 0.02f;

[self.mapView setRegion:region animated:NO];

那将是一个稳定的版本。只有在这里,该地区才非常大。如果有NSNotFound

,您可以测试delta值