1

刚刚遇到这个 iOS 6 特有的奇怪问题。我使用以下代码在 iPhone 地图中固定一组给定的地址,它在 iOs 4 和 5 上运行良好。但是在 iOS 6 上运行时崩溃,如下所示堆栈跟踪,

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid Region <center:+0.00000000, +0.00000000 span:+177.61462012, +900.00000000>'

我使用的代码很简单,

`CLLocationCoordinate2D topLeftCoord; topLeftCoord.latitude = -90; topLeftCoord.longitude = 180;

CLLocationCoordinate2D bottomRightCoord; 
bottomRightCoord.latitude = 90; 
bottomRightCoord.longitude = -180; 

for (id<MKAnnotation> annotation in self.mapView.annotations) { 
    topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude); 
    topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude); 
    bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude); 
    bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude); 
}
region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.5;
region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.5;

region = [self.mapView regionThatFits:region];
[self.mapView setRegion:region animated:YES];

`

所以问题显然在于计算 longitudeDelta 我相信因为它试图访问错误的经度 +900.000。因此,我改变了

上面的代码

region.span.latitudeDelta= self.mapView.region.span.latitudeDelta /2.0002; region.span.longitudeDelta= self.mapView.region.span.longitudeDelta /2.0002;

崩溃得到解决,但地图指向世界上不同的位置。希望大家能对此有所了解

4

2 回答 2

1

我想你明白了:

“问题显然在于计算 longitudeDelta ”

我经历过同样的事情,我所做的很简单:

-(void)myFunction
{
    MKCoordinateRegion region;
    region.span.longitudeDelta = 10;
    region.center = CLLocationCoordinate2DMake(46, 2);
    [map setRegion:region];
}

它在第 2 次或第 3 次调用后崩溃myFunction,但是当我使用latitudeDelta而不是时longitudeDelta它可以完美运行

此外,崩溃日志是:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
    reason: 'Invalid Region <center:+46.00000000, +2.00000000 span:-1.99143220, +10.00000000>'

这让我觉得这处longitudeDelta房产很糟糕。

PS:不需要设置 longitudeDelta 和 latitudeDelta 因为longitudeDelta = f(latitudeDelta)

于 2013-05-29T14:07:55.830 回答
0

当然会崩溃。

  1. 当只有 1
  2. 当只有 n 个相同位置的注解时

只需考虑这些情况并有一个备份区域,因为在这种情况下算法会失败。

例如

if(noAnnotation) setRegion: world
if(annotationCount < 2) setRegion: region for annotation1 (with a span of e.g. 0,05/0,05)
else 
    ... Do the algo
    if longitudeDelta == 0 setRegion: region for annotation1 (with a span of e.g. 0,05/0,05)
    Else setRegion: like you do now
于 2013-05-29T14:51:56.050 回答