MKTileOverlay с сетчатки-плитки
У меня есть проблемы, чтобы загрузить плитки 512x512px в MKMapKit. Сервер предоставляет плитки размером 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;
}