使用 SDWebimage 下载并缓存 MKMapSnapshotter 图像

Download and cache the MKMapSnapshotter image using SDWebimage

我想在 UITableViewCells,

中显示 mapView

所以我实际上写了这段代码


class DataPointTableCell: UITableViewCell {

    @IBOutlet weak var mapView: MKMapView!

    func addAnnotaionToMapView(_ coordinates: Coordinate) {
        removePreviousCoordinate()

        let viewCoorindate = CLLocationCoordinate2D(latitude: coordinates.latitude, longitude: coordinates.longitude)
        let annotation = MKPointAnnotation()
        annotation.coordinate = viewCoorindate

        mapView.addAnnotation(annotation)
        // animate is turned to false on purpose.
        mapView.animateToPoint(viewCoorindate, animated: false)
    }

    private func removePreviousCoordinate() {
        let annotations = self.mapView.annotations
        self.mapView.removeAnnotations(annotations)
    }
}

这种方法的问题在于它会为 mapView 位置设置动画,然后在对单元格进行双端队列时添加标记。

我采用了另一种方法,即使用 MKMapSnapshotter

private func setMapImage() {
    let rect = self.mapImageView.bounds

    let mapSnapshotOptions = MKMapSnapshotter.Options()

    // Set the region of the map that is rendered.
    let needleLocation = CLLocationCoordinate2DMake(15.4952364, 73.8343293)
    let region = MKCoordinateRegion(center: needleLocation, latitudinalMeters: 1000, longitudinalMeters: 1000)
    mapSnapshotOptions.region = region

    // Set the scale of the image. We'll just use the scale of the current device, which is 2x scale on Retina screens.
    mapSnapshotOptions.scale = UIScreen.main.scale

    // Set the size of the image output.
    mapSnapshotOptions.size = CGSize(width: 300, height: 300)

    // Show buildings and Points of Interest on the snapshot
    mapSnapshotOptions.showsBuildings = true
    mapSnapshotOptions.showsPointsOfInterest = false

    let snapshot = MKMapSnapshotter(options: mapSnapshotOptions)
    snapshot.start { snapshot, error in
        guard let snapshot = snapshot, error == nil else {
            print("\(error!.localizedDescription)")
            return
        }

        UIGraphicsBeginImageContextWithOptions(mapSnapshotOptions.size, true, 0)
        snapshot.image.draw(at: .zero)

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

        var point = snapshot.point(for: needleLocation)

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

        let image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        DispatchQueue.main.async {
            self.mapImageView.image = image
        }
    }
}

这工作正常,但我无法缓存基于任何内容的图像。

所以我想要的帮助是如何使用 SDWebimage.

下载和缓存 mapImage

首先为您的单元添加唯一键

var youUniqueCellKey = "Key"

然后在 setMapImage 首先检查图像是否已经缓存并将其分配给您的 mapImageView

private func setMapImage() {

    if let image = SDImageCache.shared().imageFromCache(forKey: youUniqueCellKey) {
        self.mapImageView.image = image
    } else {
        // Add your rest of your code here

        // At the end
        var imageToStore = UIImage() // Your mapImage

        SDImageCache.shared().store(imageToStore, forKey: youUniqueCellKey, completion: nil)
    }
}