2014-05-08 21 views
6

MKMapKit'te 512x512px fayans yükleme sorunlarım var. Sunucu, 512x512 .jpeg fayans sağlar.Retina-Fayans ile MKTileOverlay

MKMapView'daki özel retina karoları için herhangi bir çözüm veya örnek uygulaması bulamadım.

Yapmam gerekenler: Ben

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

ile MKMapView onlara yük

... fayans ölçeklendirme vardır doğru ama sadece yarısı sadece görsel (yüklenir - i istekleri kokladı ve fayans

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

... tüm karoları görüntülenen ancak ölçekleme hatalı

Bu benim çizim yöntemidir: ... overlayRenderer.contentScaleFactor hep 1 ... olup

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

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

    return overlayRenderer; 
} 

ne olursa olsun tileSize (iOS simülatörü 7.1 retina)

Herhangi bir öneriniz var mı?

Saygılarımızla, Steve

+0

bu sorun için bir çözüm buldunuz mu? – Hyndrix

cevap

1

Aşağıdaki kod yalnızca iOS 7 (değil iOS 8) üzerinde çalışmaktadır. MKTileOverlayRenderer'ı geçersiz kıl. Çini boyutu harita görünümü denetleyicisi olarak 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 

olarak ayarlanır:

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

Peki ya iOS 8? Herhangi bir fikir? –

+0

Hayır. Bu API beni rahatsız etti. Tekrar bakmadan önce bu hissi unutmak zorundayım. Şu anda iOS 8'de retina fayanslarını görüntülemiyorum. Hem karo boyutunu hem de karo ölçeğini açıkça belirtmenin bir yolu olmalı. Nasıl farklı bir şekilde yapılacağını göremiyorum. – FKDev