2010-11-11 8 views
8

Voglio creare un UIImage da un MKMapView. La mia mappa viene visualizzata correttamente nella vista, tuttavia lo UIImage prodotto è solo un'immagine grigia. Ecco lo snippet pertinente.Creare un'immagine UII da un MKMapView

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

Qualcuno sa come fare un UIImage utilizzando MapKit?

risposta

8

Sto utilizzando lo stesso codice testato con ios sdk 4.1 e funziona correttamente. Così, quando la mappa è già visualizzato all'utente e l'utente premere il pulsante di questa azione sarà chiamata:

UIImage *image = [mapView renderToImage]; 

e qui è la funzione wrapper realizzato come estensione UIView:

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

Quindi, il problema è non in quella parte di codice.

0

Se si sta chiamando questo immediatamente dopo l'inizializzazione della mappa (forse in viewDidLoad?), È possibile ottenere un'immagine grigia non appena la mappa non ha ancora finito di disegnare.

Prova:

  • Chiamando il codice di cattura usando performSelector: withObject: afterDelay: con un breve ritardo (anche 0 secondi potrebbe funzionare in modo che spara a destra dopo l'attuale metodo è finito)
  • Se sei l'aggiunta di annotazioni, chiamare il codice di cattura nel metodo delegato didAddAnnotationViews

Edit:
sul simulatore, usando perfor mSelector, un ritardo zero funziona. Sul dispositivo, è necessario un ritardo maggiore (circa 5 secondi).

Tuttavia, se si aggiungono annotazioni (e si acquisisce nel metodo didAddAnnotationViews), esso funziona immediatamente sia sul simulatore che sul dispositivo.

+0

Non credo che questo è il problema. Aspetto che la mappa si carichi, è nella visualizzazione e sembra ok. –

+0

Questo ha funzionato per me (anche su 4.1). Hai provato a chiamare l'acquisizione premendo un pulsante per vedere se si tratta di un problema di temporizzazione o qualcos'altro? – Anna

1

Ehi Loren. Ci sono più livelli in mapView. Penso che il primo sia la mappa e il secondo su è il livello di google. Potrebbero aver cambiato qualcosa nel mapkit dopo 3.1. Si può provare

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

Si può anche provare

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

Spero che questo aiuti.

3

Qui è la migliore funzione per la visualizzazione 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

Si noti che, MapView non venga completata carico in modo immagine potrebbe essere grigio. come

non sarà sempre chiamata
mapViewDidFinishLoadingMap: 

, si dovrebbe ottenere UIImage in

mapViewDidFinishRenderingMap:fullyRendered: 

modo, il codice proprio come questo

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