在iOS8中打破了MapKit Tile Overlay

时间:2014-08-04 17:38:54

标签: ios objective-c ios8 mapkit openstreetmap

我有这个代码在我的应用 over 默认的Apple one中实现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];});

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

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

<Error>: ImageIO: CGImageSourceCreateWithData data parameter is nil

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

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];});});

但这似乎无法解决问题。

1 个答案:

答案 0 :(得分:1)

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

你在块中添加叠加层似乎很奇怪。我只是添加一个动作,它似乎根本没有挂起UI。

只是做...

    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];

另外,我向Apple提交了一个错误,当他们想要一个样本时,我的叠加层将不显示...直到我设置了委托。 (即使我在故事板上连线了)。 Apple将我的bug作为副本关闭,以便他们了解它。

mapView.delegate = self