Swift 3将自定义注释引脚添加到MKMapSnapShotter快照

nib*_*tes 7 mkpointannotation mkmapsnapshotter swift3

我正在学习Swift 3,我目前的学习项目涉及允许用户拍摄照片并获取当前位置固定的地图快照.

我从2015年8月开始依赖这个答案,并从2016年6 月起回答这个问题,但是我仍然找不到合适的路径.

现在,我可以......

  1. 从缓冲区获取照片
  2. 获取地图快照

但我只是不能放置引脚.我知道我的代码不完整且无效 - 所以这不仅仅是一个调试问题.以下是我一直在使用的内容(以及基于以上链接的许多变体):

let snapShotter = MKMapSnapshotter(options: mapSnapshotOptions)

snapShotter.start() {

    snapshot, error in

        guard let snapshot = snapshot else {
            return
        }

        let image = snapshot.image
        let annotation = MKPointAnnotation()
        annotation.coordinate = needleLocation  // is a CLLocationCoordinate2D
        annotation.title = "My Title"

        let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotation")

        // I want to push the final image to a global variable
        // can't figure out how to define finalImage as the pinned map
        self.myMap = finalImage


        } // close snapShotter.start
Run Code Online (Sandbox Code Playgroud)

我已经被困了几天了,所以我当然会感激任何见解.谢谢!

Rob*_*Rob 20

MKMapSnapshot使用注释视图进行渲染,您必须在新的图形上下文中手动绘制快照image和注释视图image,并从该上下文中获取新图像.在Swift 3中:

let rect = imageView.bounds

let snapshot = MKMapSnapshotter(options: options)
snapshot.start { snapshot, error in
    guard let snapshot = snapshot, error == nil else {
        print(error ?? "Unknown error")
        return
    }

    let image = UIGraphicsImageRenderer(size: options.size).image { _ in
        snapshot.image.draw(at: .zero)

        let pinView = MKPinAnnotationView(annotation: nil, reuseIdentifier: nil)
        let pinImage = pinView.image

        var point = snapshot.point(for: location.coordinate)

        if rect.contains(point) {
            point.x -= pinView.bounds.width / 2
            point.y -= pinView.bounds.height / 2
            point.x += pinView.centerOffset.x
            point.y += pinView.centerOffset.y
            pinImage?.draw(at: point)
        }
    }

    // do whatever you want with this image, e.g.

    DispatchQueue.main.async {
        imageView.image = image
    }
}
Run Code Online (Sandbox Code Playgroud)

这是改编自/sf/answers/1314370641/,它本身改编自WWDC 2013视频Putting MapKit in Perspective.

以下是带有以下内容的快照示例.satelliteFlyover:

在此输入图像描述