首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Retina-Tiles的MKTileOverlay

带有Retina-Tiles的MKTileOverlay
EN

Stack Overflow用户
提问于 2014-05-08 14:48:07
回答 1查看 1.7K关注 0票数 5

我有问题要在MKMapKit中加载512x512px块。服务器提供512x512 .jpeg块。

我找不到任何解决方案或样本实现的定制视网膜瓷砖在MKMapView。

我所做的:

当我将它们加载到MKMapView中时

代码语言:javascript
复制
 overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
 overlay.tileSize = CGSizeMake(512.0f, 512.0f);
 [_mapView insertOverlay:overlay atIndex:MAP_OVERLAY_INDEX_TILE level:MKOverlayLevelAboveLabels];

…瓷砖的缩放是正确的,但其中只有一半是加载的(不仅仅是视觉上的-我嗅探了请求和瓷砖丢失了)

使用

代码语言:javascript
复制
 overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
 overlay.tileSize = CGSizeMake(256.0f, 256.0f);
 [_mapView insertOverlay:overlay atIndex:MAP_OVERLAY_INDEX_TILE level:MKOverlayLevelAboveLabels];

…显示所有的瓷砖,但缩放不正确。

这是我的绘画方法:

代码语言:javascript
复制
(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视网膜)

有什么建议吗?

向你问好,史蒂夫

EN

回答 1

Stack Overflow用户

发布于 2014-09-18 19:06:34

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

代码语言:javascript
复制
@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

在地图视图控制器中:

代码语言:javascript
复制
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKTileOverlay class]]) 
    {
        return [[FKDTileOverlayRenderer alloc] initWithTileOverlay:overlay];
    }
    return nil;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23545197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档