2015-08-20 2 views
5

Я пытаюсь получить моментальный снимок отображения карты с помощью методов startWithCompletionHandler для MKMapSnapshotter. и я хочу добавить индивидуальный просмотр аннотаций для снимков. и в моем пользовательском представлении аннотации есть метка. поэтому я не могу показать эту метку, когда я получаю снимок. вот код:MKMapSnapshotOptions: добавление моментального снимка пользовательского представления аннотации контактов или 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) 
    } 

как вы можете видеть drawAtPoint является функцией UIImage. Я пытаюсь использовать UIImageView, тогда я добавляю ярлык к imageView в качестве подвид, но я не могу использовать drawAtPoint с imageView, поэтому моя проблема заключается в том, что я не могу добавить ярлык в моментальный снимок mapView.

вы можете увидеть, что я имею в виду ссылку: https://www.dropbox.com/s/83hnkiqi87uy5ab/map.png?dl=0

Спасибо за советы.

ответ

9

Создание пользовательского класса AnnotationView. Когда вы создаете MKMapSnapshotter, определяете MKPointAnnotation с координатой и названием. После этого определите annotationView из вашего пользовательского класса. Вы можете создать собственный аннотационный просмотр с помощью MKPointAnnotation. И используйте метод drawViewHierarchyInRect вместо drawAtPoint.

Ваш код должен быть таким.

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

Спасибо.Это именно то, что я хочу. – ali

+0

Не можете ли вы добавить аннотацию к карте, прежде чем делать снимок? Зачем делать снимок, добавлять изображение, а затем снимать еще один снимок экрана? Кажется, пустая трата времени, не так ли? – Supertecnoboff

+1

От Apple: «Объекты Snapshotter не захватывают визуальные представления любых наложений или аннотаций, создаваемых вашим приложением. Если вы хотите, чтобы эти элементы отображались в последнем снимке, вы должны нарисовать их на полученном снимке моментального снимка». [Apple] (https://developer.apple.com/reference/mapkit/mkmapsnapshotter) – bluebamboo

Смежные вопросы