使用 Swift 3 在 iOS 10 中将图像从服务器加载到 Apple Map 中的注释视图

Posted

技术标签:

【中文标题】使用 Swift 3 在 iOS 10 中将图像从服务器加载到 Apple Map 中的注释视图【英文标题】:Loading images from server to AnnotationView in Apple Map in iOS10 using Swift3 【发布时间】:2016-11-15 17:29:50 【问题描述】:

这是我的代码:

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
    

但是加载图像需要更多时间,而且图像最初是在某一点聚集的?

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

提前致谢

【问题讨论】:

网址从何而来?您的代码似乎有三个优化机会。 1、事先获取该url的url和图片。 2. 在调用委托之前获取 UIImage。 3. 在委托调用中调整图像大小需要时间。 okey,如果我有一个图像 url 数组并且我需要显示不同的图像,那么如何在 viewforannotation 方法 @MacUserT 中做到这一点 【参考方案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(from 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(from listOfURLs:) 以防止阻塞 UI。您可能需要看看这在时间上是如何解决的。如果地图视图委托在函数 getArrayOfThumbnails(from listOfURLs:) 返回结果之前调用缩略图数组,您可能最终没有图像。然后你应该看看你是否可以批量获取图像。

希望这会有所帮助。

【讨论】:

以上是关于使用 Swift 3 在 iOS 10 中将图像从服务器加载到 Apple Map 中的注释视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 3 中将图像从服务器加载到 tableView 单元格?

如何使用 CIFilter 在 Swift 中将 UIImage 转换为灰度?

在 Swift 3 中将数据拆分为块

如何在swift ios中将多个图像添加到自定义表格视图单元格?

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

在 Swift 中将图像视图从一个视图控制器转移到另一个视图控制器