2010-11-11 24 views
8

Quiero crear un UIImage desde un MKMapView. Mi mapa se muestra correctamente en la vista, sin embargo, el UIImage producido es solo una imagen gris. Aquí está el fragmento relevante.Haz un UIImage desde un MKMapView

UIGraphicsBeginImageContext(mapView.bounds.size); 
[mapView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
mapImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Alguien sabe cómo hacer un uso MapKit UIImage?

Respuesta

8

Estoy usando el mismo código que se prueba con iOS 4.1 y funciona bien. Por lo tanto, cuando un mapa ya se visualiza para el usuario y el usuario presiona el botón de esta acción se denomina:

UIImage *image = [mapView renderToImage]; 

y aquí está la función de contenedor dado cuenta de que la extensión UIView:

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

Por lo tanto, el problema es no en esa parte del código

0

Si está llamando a esto inmediatamente después de inicializar el mapa (¿tal vez en viewDidLoad?), Puede obtener una imagen gris ya que el mapa no ha terminado de dibujar todavía.

Probar:

  • Llamando el código de captura usando performSelector: withObject: afterDelay: el uso de un breve retraso (incluso 0 segundos podría funcionar por lo que dispara justo después de finalizado el método actual)
  • Si está añadir anotaciones, llame al código de captura en el método delegado didAddAnnotationViews

Editar:
en el simulador, usando perfor mSelector, funciona un retraso cero. En el dispositivo, se requiere un retraso mayor (alrededor de 5 segundos).

Sin embargo, si agrega anotaciones (y las captura en el método didAddAnnotationViews), funciona inmediatamente tanto en el simulador como en el dispositivo.

+0

No creo que este es el problema. Espero que se cargue el mapa, está en la vista y se ve bien. –

+0

Esto me ha funcionado (también en 4.1). ¿Has intentado llamar a la captura presionando un botón para ver si se trata de un problema de tiempo u otra cosa? – Anna

1

Hola Loren. Hay múltiples capas en mapView. Creo que el primero es el mapa y el segundo es la capa de google. Podrían haber cambiado algo en el juego de mapas después de 3.1. Usted puede tratar de

[[[mapView.layer sublayers] objectAtIndex:1] renderInContext:UIGraphicsGetCurrentContext()]; 

También puede intentar

CGRect rect = [mapView bounds]; 
CGImageRef mapImage = [mapView createSnapshotWithRect:rect]; 

Espero que esto ayude.

3

Aquí es la función mejorada para visualización de la retina:

@implementation UIView (Ext) 
- (UIImage*) renderToImage 
{ 
    // IMPORTANT: using weak link on UIKit 
    if(UIGraphicsBeginImageContextWithOptions != NULL) 
    { 
    UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0); 
    } else { 
    UIGraphicsBeginImageContext(self.frame.size); 
    } 

[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return image; 
} 
1

Tenga en cuenta que, MAPview no puede finalizar la carga para que la imagen puede ser de color gris. como

mapViewDidFinishLoadingMap: 

no siempre se le llama, usted debe conseguir UIImage en

mapViewDidFinishRenderingMap:fullyRendered: 

así, el código al igual que este

- (UIImage *)renderToImage:(MKMapView *)mapView 
{ 
    UIGraphicsBeginImageContext(mapView.bounds.size); 
    [mapView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
}