MKMapView setRegion到小区域会导致卫星图像加载失败

时间:2013-05-08 21:52:15

标签: ios ios6 mkmapview mapkit

我在同一个应用程序上工作了好几个月,这是一个新问题。我想知道Apple Map数据的服务器端是否有变化。这是问题所在:

我的应用程序(有时)想要将MKMapView区域设置为特定位置周围最完全放大的值。为此,我做了类似的事情:

self.map.mapType = MKMapTypeHybrid;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(item.lat, item.lng), 1.0, 1.0);
[self.map setRegion:region animated:NO];

无论item's坐标在哪里,我都会得到网格化的“无卫星图像”背景。这似乎与可用的卫星图像无关,因为它在美国的许多地区表现一致。

我知道setRegion:animated:可能会在事后调整区域。而且我知道1平方米是一个不合理的小区域,试图在一张相当大的地图上展示。所以,我试过了

[self.map setRegion:[self.map regionsThatFits:region] animated:NO];

设置animated:YES确实可以防止这种情况发生,但我不想动画这些更改。

还有一些观察结果:

  • 如果我只缩小1或2像素,则会显示地图图像。
  • 尝试实现地图委托方法:– mapViewDidFailLoadingMap:withError:没有帮助。它从未被称为。
  • 这似乎是新的。我在应用程序商店中的应用程序的工作版本现在表现出类似的问题。
  • 我最近在其他热门应用中看到过这种情况。

对此解决方案的任何想法,或确认这是一个系统性问题?

2 个答案:

答案 0 :(得分:1)

//fix for ios6
if (region.span.latitudeDelta < .0005f)
    region.span.latitudeDelta = .0005f;
if (!region.span.longitudeDelta < .0005f)
    region.span.longitudeDelta = .0005f;

确保lat / lon的区域范围没有设置得太低,它会清空。

答案 1 :(得分:1)

我最终继承了MKMapView并覆盖了setRegion:。我已经在Github中创建了一个示例应用程序,如果有人有兴趣看到实际问题或我的解决方案:

https://github.com/DeepFriedTwinkie/iOS6MapZoomIssue

我的setRegion:方法如下所示:

- (void) setRegion:(MKCoordinateRegion)region animated:(BOOL)animated {
    @try {
        // Get the zoom level for the proposed region
        double zoomLevel = [self getFineZoomLevelForRegion:region];

        // Check to see if any corrections are needed:
        //     - Zoom level is too big (a very small region)
        //     - We are looking at satellite imagery (Where the issue occurs)
        //     - We have turned on the zoom level protection

        if (zoomLevel >= (MAX_GOOGLE_LEVELS-1) && self.mapType != MKMapTypeStandard && self.protectZoomLevel) {
            NSLog(@"setRegion: Entered Protected Zoom Level");

            // Force the zoom level to be 19 (20 causes the issue)
            MKCoordinateRegion protectedRegion = [self coordinateRegionForZoomLevel:MAX_GOOGLE_LEVELS-1.0 atCoordinate:region.center];
            [super setRegion:protectedRegion animated:animated];
        } else {
            [super setRegion:region animated:animated];
        }
    }
    @catch (NSException *exception) {
        [self setCenterCoordinate:region.center];
    }
}