2010-11-18 15 views
8

J'utilise cette fonction pour le rendu exemple MKMapView dans l'image:rendu MKMapView à UIImage avec résolution réelle

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

Cela fonctionne très bien. Mais avec iphone4 l'image rendue n'a pas la même résolution que sur l'appareil. Sur l'appareil, j'ai la qualité d'affichage de la carte 640x920, et l'image rendue a la résolution 320x460. Ensuite, j'ai doublé la taille fournie à la fonction UIGraphicsBeginImageContext() mais qui remplissait la seule partie de l'image en haut à gauche.

Question: Existe-t-il un moyen d'obtenir une carte rendue en image avec une résolution maximale de 640x920?

Répondre

8

Essayez d'utiliser UIGraphicsBeginImageContextWithOptions au lieu de UIGraphicsBeginImageContext:

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

Voir QA1703 pour plus de détails. Il dit:

Note: A partir de iOS 4, UIGraphicsBeginImageContextWithOptions vous permet de fournir un facteur d'échelle . Un facteur d'échelle égal à zéro définit sur le facteur d'échelle de l'écran principal du périphérique. Cela vous permet d'obtenir l'instantané le plus net et le plus résolu de l'écran, y compris un écran Retina .

+0

Merci! Test réussi :) – Prcela

0

iOS 7 a présenté une nouvelle méthode pour générer des captures d'écran d'un MKMapView. Il est maintenant possible d'utiliser la nouvelle API MKMapSnapshot comme suit:

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]; 
    } 
}]; 

Actuellement, tous les superpositions et les annotations ne sont pas rendus. Vous devez les restituer par la suite sur l'image instantanée obtenue. L'objet MKMapSnapshot fourni dispose d'une méthode d'aide pratique pour effectuer le mappage entre les coordonnées et les points:

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

Je reçois une erreur dans cette ligne 'options.mapType = MKMapTypeStandard; 'comment puis-je le résoudre. –

+1

@KhushbuDesai utilisez-vous Swift? – Klaas

+0

Oui et j'ai obtenu la solution 'options.mapType = .standard' –