2015-08-20 16 views
5

Sto cercando di ottenere l'istantanea della vista mappa con i metodi startWithCompletionHandler di MKMapSnapshotter. e voglio aggiungere la vista annotazione pin personalizzata per scattare foto. e c'è un'etichetta nella mia vista di annotazione personalizzata. quindi non posso mostrare quell'etichetta quando sto ricevendo un'istantanea. ecco il codice:MKMapSnapshotOptions: Aggiunta dell'istantanea della vista annotazione pin personalizzata o UIView

let snapshotter = MKMapSnapshotter(options: options) 
    snapshotter.startWithCompletionHandler() { 
     snapshot, error in 

     if error != nil { 
      completion(image: nil, error: error) 
      return 
     } 

     let image = snapshot.image 
     let pin = MKPinAnnotationView(annotation: nil, reuseIdentifier: "") // I want to use custom annotation view instead of MKPinAnnotationView 
     let pinImage = UIImage(named: "pinImage") 

     UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale); 
     image.drawAtPoint(CGPointMake(0, 0)) 
     var homePoint = snapshot.pointForCoordinate(coordinates[0]) 
     pinImage!.drawAtPoint(homePoint) 

     pinImage!.drawAtPoint(snapshot.pointForCoordinate(coordinates[1])) 

     let finalImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     completion(image: finalImage, error: nil) 
    } 

come si può vedere drawAtPoint è funzione della UIImage. Provo ad usare UIImageView quindi aggiungo label a imageView come subView ma non posso usare drawAtPoint con imageView quindi il mio problema è che non posso aggiungere un'etichetta all'istantanea mapView.

si può vedere quello che voglio dire al link: https://www.dropbox.com/s/83hnkiqi87uy5ab/map.png?dl=0

Grazie per la consulenza.

risposta

9

Creazione personalizzata di AnnotationView Class. Quando si crea MKMapSnapshotter, definire MKPointAnnotation con coordinate e titolo.Dopo aver definito annotationView dalla classe personalizzata, è possibile avviare annotation personalizzatoView con MKPointAnnotation. E usa il metodo drawViewHierarchyInRect invece di drawAtPoint.

Il tuo codice deve essere così.

let snapshotter = MKMapSnapshotter(options: options) 
    snapshotter.startWithCompletionHandler() { 
     snapshot, error in 

     if error != nil { 
      completion(image: nil, error: error) 
      return 
     } 

     let image = snapshot.image 
     var annotation = MKPointAnnotation() 
     annotation.coordinate = coordinates[0] 
     annotation.title = "Your Title" 

     let annotationView = CustomAnnotationView(annotation: annotation, reuseIdentifier: "annotation") 
     let pinImage = annotationView.image 

     UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale); 

     image.drawAtPoint(CGPointMake(0, 0)) //map 

//   pinImage!.drawAtPoint(snapshot.pointForCoordinate(coordinates[0]))       

     annotationView.drawViewHierarchyInRect(CGRectMake(snapshot.pointForCoordinate(coordinates[0]).x, snapshot.pointForCoordinate(coordinates[0]).y, annotationView.frame.size.width, annotationView.frame.size.height), afterScreenUpdates: true) 


     let finalImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     completion(image: finalImage, error: nil) 
    } 
+0

Grazie. Questo è esattamente quello che voglio. – ali

+0

Non puoi aggiungere un'annotazione alla mappa prima di scattare l'istantanea? Perché fare un'istantanea, aggiungere l'immagine e poi fare un altro screenshot? Sembra una perdita di tempo vero? – Supertecnoboff

+1

Da Apple: "Gli oggetti Snapshotter non acquisiscono le rappresentazioni visive di eventuali sovrapposizioni o annotazioni create dall'app. Se si desidera che tali elementi vengano visualizzati nell'istantanea finale, è necessario disegnarli sull'immagine risultante dello snapshot." [Apple] (https://developer.apple.com/reference/mapkit/mkmapsnapshotter) – bluebamboo

Problemi correlati