使用Swift3将图像从服务器加载到iOS10的Apple Map中的AnnotationView

时间:2016-11-15 17:29:51

标签: ios swift3 ios10

这是我的代码:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        // Don't want to show a custom image if the annotation is the user's location.
        guard !(annotation is MKUserLocation) else {
            return nil
        }

        // Better to make this class property
        let annotationIdentifier = "AnnotationIdentifier"

        var annotationView: MKAnnotationView?
        if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) {
            annotationView = dequeuedAnnotationView
            annotationView?.annotation = annotation
        }
        else {
            annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
            let btn = UIButton(type: .detailDisclosure)
            btn.setImage(UIImage(named: "abc.png") , for: .normal)
            annotationView?.rightCalloutAccessoryView = btn
        }

        if let annotationView = annotationView {
            // Configure your annotation view here

            annotationView.contentMode = .scaleAspectFit
            annotationView.sizeThatFits(CGSize(width: 10, height: 10))
            let url = URL(string: "abc url ")
            let data = try? Data(contentsOf: url!)
            let myPicture = UIImage(data: data!)
            let thumb1 = myPicture?.resizeWith(percentage: 0.1)
            annotationView.image = thumb1

        }

        return annotationView
    }

但是它需要更多的时间来加载图像,最初也会在一点聚集图像?

请建议我如何在不创建自定义类的情况下将图片从网址加载到AnnotationView自定义图片中。

提前致谢

1 个答案:

答案 0 :(得分:1)

我没有完全相同的问题,但我需要从照片库中加载一系列图像作为调出图像。我解决这个问题的方法是让类以两个数组开头

class MyMapViewController: UIViewController, MKMapViewDelegate {

    var urlArray = [url]()
    var thumbnailArray = [UIImage]()
    //and whatever vars and lets you need

    override viewDidLoad() {
        super.viewDidLoad()

        thumbnailArray = getArrayOfThumbnails(from listOFURLs: urlArray)

        //Now here set up your map view and create the annotations 
    }

函数getArrayOfThumbnails(来自listOfURLs :)可以在单独的类或视图控制器中创建,具体取决于您的应用程序以及模型包含的URL或图像。

func getArrayOfThumbnails(from listOfURLs: [url]) -> [UIImage] {

    let imageRect = CGRect(x: 0, y: 0, width: 10, height: 10)
    var returnThumbnails = [UIImage]()
    var counter = 0

    for url in listOfURLs {
        let myImage = CIImage(contentOf: url)

        returnTumbnails[counter] = UIImage(ciImage: myImage.cropping(to: imageRect)
    }
    return returnThumbnails
}

然后在地图视图委托方法中,您可以从准备好的缩略图数组中获取缩略图。由于我不知道选择哪个图像的标准是什么,我将缩略图放在一个数组中。但是,您也可以将它们放入字典中,并根据您使用特定注释选择正确图像的条件将它们从字典中删除。

在我的应用程序中,从照片库中取出图像变得非常快,并且不会阻塞UI。如果要从带宽较低的服务器加载大量图像,我会从与主队列不同的队列中调用getArrayOfThumbnails(来自listOfURLs :)以防止阻塞UI。您可能需要了解这与时间的关系。如果地图视图委托在函数getArrayOfThumbnails(来自listOfURLs :)之前调用缩略图数组返回结果,则最终可能没有图像。然后,您应该看看是否可以批量获取图像。

希望这有帮助。