使用无效参数调用“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 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI MapKit 的 updateUIView 中添加“.setRegion”?
系统检测到在一个调用中尝试使用指针参数时的无效指针地址 问题