2014-05-08 17 views
6

Mam problemy z ładowaniem płytek 512x512px w MKMapKit. Serwer zapewnia płytki 5 .12x512 .jpeg.MKTileOverlay z Retina-Tiles

Nie znalazłem żadnego rozwiązania ani implementacji przykładowej niestandardowej płytki siatkówki w MKMapView.

Co robię:

Kiedy załadować je do MKMapView z

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

... Płytki są skalowanie poprawne, ale tylko połowa z nich jest ładowany (nie tylko wizualnie - i powąchał wnioski i płytki brakuje)

z

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

... wszystkie płytki są wyświetlane, ale skalowanie nieprawidłowy

To jest moja metoda rysunek:

(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay 
{ 
    MKOverlayRenderer *overlayRenderer = nil; 

    if([overlay isKindOfClass:MKTileOverlay.class]) 
    { 
     overlayRenderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay]; 
    } 

    return overlayRenderer; 
} 

... The overlayRenderer.contentScaleFactor jest zawsze 1 ... nieważne co tileSize (iOS 7.1 symulator siatkówki)

Jakieś sugestie?

poważaniem, Steve

+0

Znalazłeś rozwiązanie tego problemu? – Hyndrix

Odpowiedz

1

Poniższy kod działa tylko na iOS 7 (nie iOS 8). Zastąp MKTileOverlayRenderer. Płytka rozmiar jest ustawiony na 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 

W swoim kontrolerze widoku mapy:

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

A co z systemem iOS 8? Jakieś pomysły? –

+0

Nie. Ten interfejs API mnie zirytował. Muszę zapomnieć o tym poczuciu, zanim znów na nie spojrzę. Obecnie nie wyświetlam kafelków siatkówki w systemie iOS 8. Powinien istnieć sposób na wyraźne podanie zarówno rozmiaru płytki, jak i skali płytki. Nie widzę, jak można to zrobić inaczej. – FKDev