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 - 将不同的图像从数组设置到注释引脚的主要内容,如果未能解决你的问题,请参考以下文章