当MKMapView完全缩小时,Zoom在Zoom中的问题

3

我在按钮点击时缩小地图。

因此,当地图完全缩小并再次尝试缩小时,设置区域时会崩溃。

不确定,但有没有办法检测地图是否已经达到了最大缩放限制?

这是我的缩小地图的代码:

-(void)setZoomLevelForNoPicksCurrentLocationAt:(CLLocationCoordinate2D)currentCoordinate{
 MKCoordinateSpan span;
 MKCoordinateRegion region;
 region.center = currentCoordinate;
 span.latitudeDelta =self.mapView.region.span.latitudeDelta *2;
 span.longitudeDelta =self.mapView.region.span.longitudeDelta *2;
 region.span = span;
 [self.mapView setRegion:region animated:YES];  
 [self.mapView regionThatFits:region];
}

任何形式的帮助都将不胜感激。
请查看崩溃日志:
终止应用程序,原因是未捕获的异常 'NSInvalidArgumentException',原因是:'无效区域中心:+38.82259098,-67.50000000 跨度:+307.41536753,+450.00000000'
* 在第一次抛出时调用堆栈: ( 0 CoreFoundation 0x013c8be9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x0151d5c2 objc_exception_throw + 47 2 CoreFoundation 0x013c8b21 -[NSException raise] + 17 3 XXXapp 0x000ab237 -[MapViewController setZoomLevelForNoPicksCurrentLocationAt:] + 312 )

请在控制台和堆栈跟踪中发布崩溃消息,你能做到吗? - Denis
我已经说明了崩溃的原因。地图被缩放到最大范围,现在我再次调用上述函数,试图再次缩小地图,导致崩溃。请在问题中查找崩溃日志。 - Suresh Varma
2
正如@iamsult所指出的那样,增量超出了范围。纬度增量必须在0到180之间,经度增量必须在0到360之间。在调用setRegion之前,根据需要调整增量。另外,调用regionThatFits是无意义的。 - user467105
谢谢Anna。通过谷歌搜索,我得到了最大的范围,所以问题解决了。但如果这是一个答案,我肯定会投票支持它。 - Suresh Varma
3个回答

11

您可以提供的最小跨度值为0.0。运行时,跨度值变为负数会导致崩溃。请进行硬编码并尝试添加一个nslog以监视跨度值。最大跨度值为180.0,超过此值将导致崩溃。


我尝试使用NSLog()来检查,但是您可以在代码中看到span的值增加了两倍。 因此,最初它是0.87,然后正常工作直到103.00,但当我将其加倍到306.00时,它会崩溃...因此,span的值肯定可以超过0.0。也许您错字了,应该是minimum而不是maximum :P - Suresh Varma
你也可以在下面添加的崩溃日志中看到 span 值。你有任何想法,span 最大可以设置为多少? - Suresh Varma
1
抱歉打错了。span 的最大值为 180.0。 - iamsult
你是正确的。但是根据问题,你可以看到问题不是因为低于180,而是因为超过了180。我已经解决了这个问题。但如果你能在你的答案中加入同样的内容,我就可以选择你的答案的原因 :) - Suresh Varma

4
我刚刚对增量计算添加了以下检查,以防在应用区域时发生崩溃:
//calculate deltas
double deltaLat = fabs(max_lat - min_lat) * 2;
if (deltaLat > 180) deltaLat = 180;

double deltaLong = fabs(max_long - min_long) * 2;
if (deltaLong>360) deltaLong = 360;

因此,地区的纬度差不能超过180度,经度差不能超过360度。


这实际上是更好的答案。第一个(被接受的)只是部分正确! - toom

0

在几次试错测试后,我用Swift 3.0编写了解决方案。

这是我计算delta的方法:

let distanceLat = min(abs((currentLatitude! - pinLatitude) * 5), 180)
let distanceLon = min(abs((currentLongitude! - pinLongitude) * 5), 180)

*5是任意的,随意根据你的需要进行更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接