带有Retina-Tiles的MKTileOverlay
我有问题要在MKMapKit中加载512x512px图块。 服务器提供512×512 .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 )overlay { MKOverlayRenderer *overlayRenderer = nil; if([overlay isKindOfClass:MKTileOverlay.class]) { overlayRenderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay]; } return overlayRenderer; }
… overlayRenderer.contentScaleFactor总是1 …无论是什么tileSize(iOS模拟器7.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)overlay { if ([overlay isKindOfClass:[MKTileOverlay class]]) { return [[FKDTileOverlayRenderer alloc] initWithTileOverlay:overlay]; } return nil; }