Swift - 将不同的图像从数组设置到注释引脚

Posted

技术标签:

【中文标题】Swift - 将不同的图像从数组设置到注释引脚【英文标题】:Swift - setting different images from array to annotation pins 【发布时间】:2015-01-19 20:43:21 【问题描述】:

我想知道如何将不同的图像设置为 mapview 上的注释图钉。以下问题的区别

viewForAnnotation confusion and customizing the pinColor iteratively

Swift different images for Annotation

我的图像数组是根据服务器响应动态生成的。数组没有固定大小,因此 switch/case 构造不是一个好主意。此外,我不确定如何应用上述主题中提到的自定义类的解决方案。我知道最好对之前提出的问题之一发表评论,但不幸的是,我现在太菜鸟了,不能这样做(分数太少)。

这是在显示地图的函数内部执行的 for 循环:

for var r=0;r<arrayOfRestaurants.count;r++
    

        var summonRestaurant:NSDictionary = arrayOfRestaurants[r] as NSDictionary
        var nearbyRestaurant = Restaurant(nearbyRestaurants:summonRestaurant)
        var latRestaurant=(nearbyRestaurant.latitude as NSString).doubleValue
        var longRestaurant=(nearbyRestaurant.longitude as NSString).doubleValue
        var locationOfRestaurant = CLLocationCoordinate2D(
            latitude: latRestaurant as CLLocationDegrees, longitude: longRestaurant as CLLocationDegrees)
        var lunchArray: NSArray = nearbyRestaurant.lunch as NSArray
        var annotation = MKPointAnnotation()

        annotation.setCoordinate(locationOfRestaurant)
        annotation.title = nearbyRestaurant.name + "  " + nearbyRestaurant.distance + " km"
        map.addAnnotation(annotation)

这里是 viewForAnnotation 委托方法(与上述线程中使用的方法完全相同):

func mapView(map: MKMapView!,
    viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! 

        if annotation is MKUserLocation 
            //return nil so map view draws "blue dot" for standard user location
            return nil
        

        let reuseId = "pin"

        var pinView = map.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
        if pinView == nil 
            pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            pinView!.canShowCallout = true
            pinView!.animatesDrop = true
            pinView!.pinColor = .Purple

            pinView!.image = globalImageArray[0]

            
        else 
            pinView!.annotation = annotation
        

        return pinView

如您所见,我为 pinView 分配了一个特定图像,即 globalImageArray[0],但我正在寻找一种解决方案,让我遍历 globalImageArray 并为每个 pin 分配特定图像。

很高兴得到任何帮助,在此先感谢!

【问题讨论】:

注解和图钉是什么关系?你怎么知道每个注释对应的是哪张图片? array 中的图像与 pin 的创建顺序相同,arrayOfRestaurants 的每一项在 globalImageArray 中都有对应的项 因此,您需要创建自己的采用 MKAnnotation 协议的类并将图像存储在注释本身的属性中,而不是使用 MKPointAnnotation。这基本上是您链接的第二个问题中的方法 恐怕我不知道如何做好。您介意通过回答问题进行详细说明吗?谢谢! 【参考方案1】:

首先,您需要创建自己的类,该类采用MKAnnotation 协议进行注释 -

class RestaurantAnnotation : NSObject, MKAnnotation 
    var coordinate: CLLocationCoordinate2D
    var title: String
    var subtitle: String
    var image: UIImage?

    init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String) 
        self.coordinate = coordinate
        self.title = title
        self.subtitle = subtitle
    

然后,在添加注解和设置图片的时候使用这个类的实例——

for var r=0;r<arrayOfRestaurants.count;r++
    

        var summonRestaurant:NSDictionary = arrayOfRestaurants[r] as NSDictionary
        var nearbyRestaurant = Restaurant(nearbyRestaurants:summonRestaurant)
        var latRestaurant=(nearbyRestaurant.latitude as NSString).doubleValue
        var longRestaurant=(nearbyRestaurant.longitude as NSString).doubleValue
        let locationOfRestaurant = CLLocationCoordinate2D(
            latitude: latRestaurant as CLLocationDegrees, longitude: longRestaurant as CLLocationDegrees)
        var lunchArray: NSArray = nearbyRestaurant.lunch as NSArray

        let title = nearbyRestaurant.name + "  " + nearbyRestaurant.distance +" km"
        var annotation = RestaurantAnnotation(coordinate, title:title, subtitle:"")
        annotation.image = globalImageArray[r]
        map.addAnnotation(annotation)

现在,在您的注释视图中,您可以访问图像 -

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! 
    if !(annotation is RestaurantAnnotation) 
        return nil
    

    let reuseId = "restaurant"
    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if anView == nil 
        anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        anView.canShowCallout = true
    
    else 
        anView.annotation = annotation
    

    let restaurantAnnotation = annotation as RestaurantAnnotation

    if (restaurantAnnotation.image != nil) 
            anView.image = restaurantAnnotation.image!
            anView.image.layer.setCornerRadius(8.0)
            anView.image.layer.clipsToBounds=true
        
        else 
         // Perhaps set some default image
        

    return anView

【讨论】:

谢谢你,这太棒了,工作得很好!我非常感谢!我稍微修改了将自定义类创建为 var annotation = RestaurantAnnotation(coordinate: locationOfRestaurant, title: "somestring", subtitle: "somestring") 的行,因此可以使用定义的初始化程序。不过,谢谢! 太棒了。我并没有真正使用 Swift,所以我不确定默认初始化程序是否也能正常工作。 如果您不介意,还有一个简短的问题:我想设置带有圆角的引脚图像,应该在注释类中完成还是直接在委托方法中完成?因为 UIImage 与 UImageView 存在一些问题 查看我的编辑。当您将图像加载到数组中时,您可能可以设置圆角,而不是在注释视图函数中设置它 我尝试了类似的方法,但没有成功,应用程序崩溃了。但我想原因是我在这样做之前调整了图像的大小。感谢兄弟的努力,我会尝试自己解决,如果我失败了,我会发布一个相关的问题。

以上是关于Swift - 将不同的图像从数组设置到注释引脚的主要内容,如果未能解决你的问题,请参考以下文章

STM32的引脚BOOT0 BOOT1的功能。

STM32的引脚BOOT0 BOOT1的功能。

Swift 3 Firebase 到 MapKit

Swift - MKAnnotationView 地图引脚的自定义 UIView

iPhone Mapkit 将自定义图像和引脚添加到注释中

带有默认地图视图引脚的 Swift Mapview 自定义调出视图