带有 Retina-Tiles 的 MKTileOverlay

Posted

技术标签:

【中文标题】带有 Retina-Tiles 的 MKTileOverlay【英文标题】:MKTileOverlay with Retina-Tiles 【发布时间】:2014-05-08 14:48:07 【问题描述】:

我在 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 Retina)

有什么建议吗?

最好的问候,史蒂夫

【问题讨论】:

你找到解决这个问题的方法了吗? 【参考方案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;

【讨论】:

iOS 8 怎么样?有什么想法吗? 不。这个 API 惹恼了我。在我再次看它之前,我必须忘记这种感觉。现在我没有在 iOS 8 中显示视网膜图块。应该有一种方法可以明确地提供图块大小和图块比例。我看不出有什么不同的方法。

以上是关于带有 Retina-Tiles 的 MKTileOverlay的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 uuencode 的“sendmail”发送邮件,并带有主题

带有和不带有聚合的 sql 查询

带有滚动的 Div 和带有绝对位置的内容

带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?