2010-11-18 13 views
8

sto usando questa funzione per il rendering esempio MKMapView in immagine:rendering MKMapView a UIImage con risoluzione reale

@implementation UIView (Ext) 
- (UIImage*) renderToImage 
{ 
    UIGraphicsBeginImageContext(self.frame.size); 
    [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 

Questo funziona bene. Ma con iphone4 l'immagine renderizzata non ha la stessa risoluzione che ha sul dispositivo. Sul dispositivo ho la qualità di visualizzazione della mappa 640x920 e l'immagine di rendering ha la risoluzione 320x460. Quindi ho raddoppiato la dimensione fornita alla funzione UIGraphicsBeginImageContext() ma che ha riempito l'unica parte dell'immagine in alto a sinistra.

Domanda: C'è un modo per ottenere il rendering della mappa per l'immagine con una risoluzione massima di 640x920?

risposta

8

Prova utilizzando UIGraphicsBeginImageContextWithOptions invece di UIGraphicsBeginImageContext:

UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0); 

Vedere QA1703 per maggiori dettagli. Dice:

Nota: A partire da iOS 4, UIGraphicsBeginImageContextWithOptions consente di fornire con una scala di fattore. Un fattore di scala pari a zero lo imposta sul fattore di scala della schermata principale del dispositivo della schermata principale del dispositivo. Ciò consente di ottenere lo istantanea dello schermo più nitida e con la massima risoluzione , incluso uno schermo Retina .

+0

Grazie! Test superato :) – Prcela

0

iOS 7 ha introdotto un nuovo metodo per generare schermate di un MKMapView. E 'ora possibile utilizzare la nuova API MKMapSnapshot come segue:

MKMapView *mapView = [..your mapview..] 

MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc]init]; 
options.region = mapView.region; 
options.mapType = MKMapTypeStandard; 
options.showsBuildings = NO; 
options.showsPointsOfInterest = NO; 
options.size = CGSizeMake(1000, 500); 

MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc]initWithOptions:options]; 
[snapshotter startWithQueue:dispatch_get_main_queue() completionHandler:^(MKMapSnapshot *snapshot, NSError *error) { 
    if(error) { 
     NSLog(@"An error occurred: %@", error); 
    } else { 
     [UIImagePNGRepresentation(snapshot.image) writeToFile:@"/Users/<yourAccountName>/map.png" atomically:YES]; 
    } 
}]; 

Attualmente tutte le sovrapposizioni e le annotazioni non sono resi. Devi renderli successivamente sull'immagine di istantanea risultante tu stesso. L'oggetto MKMapSnapshot fornito ha un pratico metodo di supporto per eseguire la mappatura tra coordinate e punti:

CGPoint point = [snapshot pointForCoordinate:locationCoordinate2D]; 
+0

Sto ricevendo errore in questa riga 'options.mapType = MKMapTypeStandard; 'come posso risolverlo. –

+1

@KhushbuDesai stai usando Swift? – Klaas

+0

Sì e ho la soluzione 'options.mapType = .standard' –