5

我在 MKMapKit 中加载 512x512px 瓷砖时遇到问题。服务器提供 512x512 .jpeg 切片。

我在 MKMapView 中找不到自定义视网膜图块的任何解决方案或示例实现。

我所做的:

当我将它们加载到 MKMapView 中时

 overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
 overlay.tileSize = CGSizeMake(512.0f, 512.0f);
 [_mapView insertOverlay:overlay atIndex:MAP_OVERLAY_INDEX_TILE level:MKOverlayLevelAboveLabels];

......瓷砖缩放正确,但只有一半被加载(不仅在视觉上 - 我嗅到了请求并且瓷砖丢失了)

 overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
 overlay.tileSize = CGSizeMake(256.0f, 256.0f);
 [_mapView insertOverlay:overlay atIndex:MAP_OVERLAY_INDEX_TILE level:MKOverlayLevelAboveLabels];

... 显示所有图块,但缩放不正确

这是我的绘图方法:

(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay
{
    MKOverlayRenderer *overlayRenderer = nil;

    if([overlay isKindOfClass:MKTileOverlay.class])
    {
        overlayRenderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];
    }

    return overlayRenderer;
}

... overlayRenderer.contentScaleFactor 始终为 1 ... 无论 tileSize 是什么(iOS 模拟器 7.1 视网膜)

有什么建议么?

最好的问候,史蒂夫

4

1 回答 1

1

以下代码仅适用于 iOS 7(不适用于 iOS 8)。覆盖 MKTileOverlayRenderer。平铺大小设置为 256。

@implementation FKDTileOverlayRenderer
-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    CGFloat scale = [[UIScreen mainScreen] scale];
    if (scale > 1.0)
    {
        CGSize tileSize = ((MKTileOverlay*)self.overlay).tileSize;
        CGRect rect = [self rectForMapRect:mapRect];

        CGContextSaveGState(context);
        CGAffineTransform t = CGContextGetCTM(context);
        CGContextConcatCTM(context, CGAffineTransformInvert(t));
        double ratio = tileSize.width/(rect.size.width*2);

        CGContextTranslateCTM(context, (double)(-rect.origin.x)*ratio, tileSize.height+ratio*(double)rect.origin.y);
        CGContextScaleCTM(context, ratio, -ratio);

        [super drawMapRect:mapRect zoomScale:zoomScale inContext:context];
        CGContextRestoreGState(context);
    }
    else
        [super drawMapRect:mapRect zoomScale:zoomScale inContext:context];
}
@end

在您的地图视图控制器中:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKTileOverlay class]]) 
    {
        return [[FKDTileOverlayRenderer alloc] initWithTileOverlay:overlay];
    }
    return nil;
}
于 2014-09-18T19:06:34.083 回答