在 MKMapView 中设置区域有时会导致跨度加倍。这个错误似乎出现在地图初始化阶段的早期。尽管已在其他地方报道过,但我无法找到现有的解决方法,因此我在此处发布了我的修复程序。它依赖于 regionThatFits 方法也会产生错误的事实。我正在使用 iPhone OS 3.12,但在 3.0 beta 中报告了该错误。此代码位于包含您的 MKMapView 的 UIViewController 中:
- (BOOL)doubleSpanBugDetected:(MKCoordinateRegion)region fittedRegion:(MKCoordinateRegion)fitted
{
float latRatio = fitted.span.latitudeDelta / region.span.latitudeDelta;
float lonRatio = fitted.span.longitudeDelta / region.span.longitudeDelta;
BOOL latDoubled = (latRatio > 1.8 && latRatio < 2.2); // within 10% of x2
BOOL lonDoubled = (lonRatio > 1.8 && lonRatio < 2.2); // within 10% of x2
return latDoubled && lonDoubled;
}
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated
{
//fixes setRegion span doubling bug
// see: http://osmorphis.blogspot.com/2009/12/mapkit-span-doubling-bug.html
// see: http://www.iphonedevsdk.com/forum/iphone-sdk-development/15810-mkmapview-needs-time-think.html
MKCoordinateRegion fitted = [self.mapView regionThatFits:region];
if ([self doubleSpanBugDetected:region fittedRegion:fitted]) {
MKCoordinateSpan span = MKCoordinateSpanMake(fitted.span.latitudeDelta/2.0, fitted.span.longitudeDelta/2.0);
MKCoordinateRegion regionHack = MKCoordinateRegionMake(fitted.center, span);
[self.mapView setRegion:regionHack animated:animated];
} else {
[self.mapView setRegion:fitted animated:animated];
}
}