使用无效参数调用“setRegion”时,iOS 6 Map 崩溃

Posted

技术标签:

【中文标题】使用无效参数调用“setRegion”时,iOS 6 Map 崩溃【英文标题】:iOS 6 Map crashes when calling 'setRegion' with invalid argument 【发布时间】:2012-10-02 22:23:42 【问题描述】:

刚刚遇到这个 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;

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

【问题讨论】:

你的问题是减去几个数字。在 NSLog 语句或 NSLog 语句中放置一些断点,看看你的最后一行在哪里给你错误的数字。将每个元素分解为局部变量,这样也会更容易。 我认为问题是 regionThatFits 被称为 0 区域 【参考方案1】:

我想你明白了:

" 问题显然在于计算 longitudeDelta"

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

-(void)myFunction

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

它在第二次或第三次调用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)

【讨论】:

【参考方案2】:

当然会崩溃。

    只有 1 个时 当只有 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

【讨论】:

以上是关于使用无效参数调用“setRegion”时,iOS 6 Map 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS版本之间的setRegion不一致吗?

如何在 SwiftUI MapKit 的 updateUIView 中添加“.setRegion”?

系统检测到在一个调用中尝试使用指针参数时的无效指针地址 问题

调用 User32 PostMessage 时过程调用或参数无效(错误 5)

无效的过程调用或参数

装饰器仅在装饰方法时有效,但在使用作为参数传递的方法调用装饰器时无效