MKMapView setRegion:在世界边缘崩溃

Ste*_*ord 5 objective-c core-location mapkit mkmapview

我正在使用此代码来设置一个区域MKMapView,使其居中pin并缩放以显示大约10km的区域.

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

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

mapSubView绘制时发生崩溃: -

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

我第一次尝试解决此问题是检查"边缘"纬度/长度(-90,+ 90,-180,+ 180),这解决了这个问题.但是,如果纬度更改为-89.99999,则问题将返回.

我猜这是由于纬度存在的组合-90和/或区域跨度的经度三角洲是如此之大,导致在实际上是"这个世界的"一区:P

任何关于如何在任何坐标处围绕销钉居中的建议,显示~10km的区域,没有这种碰撞将是非常感谢.

Ser*_*hin 6

@supp-f 答案是对的

斯威夫特 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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Mir*_*ner 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];
Run Code Online (Sandbox Code Playgroud)

那将是一个稳定的版本。只有这里,地域才非常大。如果存在 NSNotFound,您可以测试增量值