Загрузите и кэшируйте образ MKMapSnapshotter, используя SDWebimage - PullRequest
2 голосов
/ 17 апреля 2019

Я хочу показать mapView в UITableViewCells,

Так что я действительно написал этот код


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

Это прекрасно работает, но я не могу кэшировать изображение на основе чего-либо.

Итак, мне нужна помощь в том, как загрузить и кэшировать mapImage, используя SDWebimage .

1 Ответ

1 голос
/ 17 апреля 2019

Сначала добавьте уникальный ключ для своей ячейки

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