在iOS8中打破了MapKit Tile Overlay

vla*_*fau 19 objective-c openstreetmap mapkit ios ios8

我有这个代码在我的应用程序中通过默认的Apple 实现OSM :

dispatch_async(dispatch_get_main_queue(), ^{
    NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png";
    MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
    overlay.canReplaceMapContent = YES;
    [self.mapView addOverlay:overlay level:MKOverlayLevelAboveLabels];});
Run Code Online (Sandbox Code Playgroud)

和:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
if ([overlay isKindOfClass:[MKTileOverlay class]]) {
    return [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];
}
else return nil;
}
Run Code Online (Sandbox Code Playgroud)

在iOS 7中它很好,但现在它返回多次并且根本没有加载地图:

<Error>: ImageIO: CGImageSourceCreateWithData data parameter is nil
Run Code Online (Sandbox Code Playgroud)

我该如何解决?我试图重构我的代码,所以现在第一块代码:

dispatch_queue_t fetchTiles = dispatch_queue_create("fetcher", NULL);
dispatch_async(fetchTiles, ^{
    NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png";
    MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
    overlay.canReplaceMapContent = YES;
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.mapView addOverlay:overlay level:MKOverlayLevelAboveLabels];});});
Run Code Online (Sandbox Code Playgroud)

但这似乎并没有解决问题.

Bil*_*son 1

您使用的代码看起来不错,除了......

您在块中进行添加叠加似乎很奇怪。我只是添加了一个操作,它似乎根本没有挂起用户界面。

做就是了...

    NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png";
    MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
    overlay.canReplaceMapContent = YES;
    [self.mapView addOverlay:overlay level:MKOverlayLevelAboveLabels];
Run Code Online (Sandbox Code Playgroud)

另外,我向 Apple 提交了一个错误,当他们想要样本时,我的叠加层不会显示......直到我设置委托。(尽管我已经在故事板中连接起来了)。Apple 将我的错误作为重复项关闭,以便他们知道。

mapView.delegate = self
Run Code Online (Sandbox Code Playgroud)