2014-05-08 9 views
6

Ho problemi con il caricamento di tessere 512x512px in MKMapKit. Il server fornisce 512x512 file .jpeg.MKTileOverlay con Retina-Piastrelle

Non sono riuscito a trovare alcuna soluzione o implementazione di esempio per piastrelle retina personalizzate in MKMapView.

Quello che faccio io:

Quando li si carica in MKMapView con

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

... piastrelle sono ridimensionamento corretto, ma solo la metà di essi viene caricato (non solo visivamente - ho annusato le richieste e le piastrelle mancanti)

con

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

... tutte le tessere vengono visualizzate, ma il ridimensionamento errato

Questo è il mio metodo di disegno:

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

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

    return overlayRenderer; 
} 

... l'overlayRenderer.contentScaleFactor è sempre 1 ... non importa quale tileSize (simulatore iOS 7.1 retina)

Qualche suggerimento?

Con i migliori saluti, Steve

+0

Avete trovato una soluzione per questo problema? – Hyndrix

risposta

1

Il seguente codice funziona solo su iOS 7 (non iOS 8). Ignora MKTileOverlayRenderer. formato delle mattonelle è impostato su 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 

nella mappa controller della vista:

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

E che ne dici di iOS 8? Qualche idea? –

+0

No. Questa API mi ha infastidito. Devo dimenticare questa sensazione prima di guardarla di nuovo. Al momento non visualizzo le tessere retina in iOS 8. Ci dovrebbe essere un modo per fornire esplicitamente sia la dimensione della piastrella che la scala delle tessere. Non vedo come possa essere fatto diversamente. – FKDev