使用SDWebimage

时间:2019-04-17 04:31:44

标签: swift uitableview sdwebimage mkmapsnapshotter

我想在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。

1 个答案:

答案 0 :(得分:1)

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

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)
    }
}