gpt4 book ai didi

ios - 带有 Retina-Tiles 的 MKTileOverlay

转载 作者:可可西里 更新时间:2023-11-01 03:59:14 29 4
gpt4 key购买 nike

我在 MKMapKit 中加载 512x512px 的图 block 时遇到问题。服务器提供 512x512 .jpeg 图 block 。

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

我的工作:

当我使用

将它们加载到 MKMapView 中时
 overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
overlay.tileSize = CGSizeMake(512.0f, 512.0f);
[_mapView insertOverlay:overlay atIndex:MAP_OVERLAY_INDEX_TILE level:MKOverlayLevelAboveLabels];

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

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

…显示所有图 block 但缩放比例不正确

这是我的画法:

(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 视网膜)

有什么建议吗?

最好的问候,史蒂夫

最佳答案

以下代码仅适用于 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

在您的 map View Controller 中:

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

关于ios - 带有 Retina-Tiles 的 MKTileOverlay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23545197/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com