2010-11-18 18 views
8

estoy usando esta función para la prestación ejemplo MKMapView en la imagen:representación MKMapView a UIImage con la resolución real de

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

Esto funciona bien. Pero con iphone4, la imagen renderizada no tiene la misma resolución que realmente tiene en el dispositivo. En el dispositivo tengo la calidad de vista de mapa 640x920, y la imagen renderizada tiene la resolución 320x460. Luego dupliqué el tamaño que se proporciona a la función UIGraphicsBeginImageContext() pero que llenó la única parte de la imagen de la esquina superior izquierda.

Pregunta: ¿Hay alguna manera de obtener un mapa procesado en la imagen con una resolución completa de 640x920?

Respuesta

8

Trate de usar UIGraphicsBeginImageContextWithOptions en lugar de UIGraphicsBeginImageContext:

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

Ver QA1703 para más detalles. Dice:

Nota: A partir de IOS 4, UIGraphicsBeginImageContextWithOptions le permite proporcionar con un factor de escala. Un factor de escala de cero lo establece en el factor de escala de la pantalla principal del dispositivo . Esto le permite obtener la instantánea más nítida y de mayor resolución de la pantalla, que incluye una pantalla Retina .

+0

¡Gracias! La prueba pasó :) – Prcela

0

iOS 7 introdujo un nuevo método para generar capturas de pantalla de un MKMapView. Ahora es posible utilizar la nueva API MKMapSnapshot de la siguiente manera:

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

Actualmente todas las superposiciones y las anotaciones no se representan. Luego debe renderizarlos en la imagen de instantánea resultante. El objeto proporcionado MKMapSnapshot tiene un práctico método de ayuda para hacer la asignación entre coordenadas y puntos:

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

Recibo el error en esta línea 'options.mapType = MKMapTypeStandard; 'cómo puedo resolverlo. –

+1

@KhushbuDesai ¿estás usando Swift? – Klaas

+0

Sí y tengo la solución 'options.mapType = .standard' –

Cuestiones relacionadas