首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MKMapSnapshotter下载并缓存SDWebimage映像

使用MKMapSnapshotter下载并缓存SDWebimage映像
EN

Stack Overflow用户
提问于 2019-04-17 04:31:44
回答 1查看 298关注 0票数 2

我想给mapView看UITableViewCells

所以我写了这段代码

代码语言:javascript
复制
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

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-17 04:56:11

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

代码语言:javascript
复制
var youUniqueCellKey = "Key"

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

代码语言:javascript
复制
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)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55719933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档