我尝试使用注释制作一个简单的地图,但是当我尝试运行它时,detailCalloutAccessoryView的图像是相同的,但我确定我放了两个不同的图像,这是怎么发生的?或者有没有人有更好的方法来做到这一点?
var tripspot:[tripSpot] = [
tripSpot( title: "1", coordinate: CLLocationCoordinate2DMake(24.149062, 120.684891), location: "台中市北區一中街", type: "rare",cllocation:CLLocation(latitude: 24.181143, longitude: 120.593158),image : "025"),
tripSpot( title: "2", coordinate: CLLocationCoordinate2DMake(24.180407, 120.645086), location:"台中逢甲", type: "rare",cllocation:CLLocation(latitude: 24.180407, longitude: 120.645086),image : "007")]
// Build LocationManager
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// set data
setupData()
}
func setupData(){
for aSpot in tripspot {
//set annotation
let coordinate = aSpot.coordinate
let title = aSpot.title
let type = aSpot.type
//set annotation
let tripSpotAnnotation = MKPointAnnotation()
tripSpotAnnotation.coordinate = coordinate
tripSpotAnnotation.title = title
tripSpotAnnotation.subtitle = type
mapView.addAnnotations([tripSpotAnnotation])
}
}
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
{
if annotation.isKindOfClass(MKUserLocation)
{
return nil
}
var view = mapView.dequeueReusableAnnotationViewWithIdentifier("annotationIdentifier")as? MKPinAnnotationView
if view == nil
{
view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotationIdentifier")
view?.canShowCallout = true
view?.sizeToFit()
}
else{
view!.annotation = annotation
}
for aSpot in tripspot{
// set pinview
let detailCalloutAccessoryView = UIImageView(frame: CGRectMake(0, 0, 53, 53))
detailCalloutAccessoryView.image = UIImage(named: aSpot.image!)
view?.detailCalloutAccessoryView = detailCalloutAccessoryView
view?.pinTintColor = pinColor(annotation.subtitle!!)
}
return view
}
感谢任何建议。
答案 0 :(得分:1)
您不应该遍历tripSpot
中viewForAnnotation
的整个数组。这个方法适用于特定的注释,但是这样写的方式,它将重复设置(并重置)每个注释的细节附件,作为aSpot
中每个tripspot
的每个图像,有效地给出每个注释与最后一个tripspot
相同的细节附件(并且效率低下)。
相反,将注释设为MKPointAnnotation
的子类并添加属性,以便它知道要用于给定注释的图像。如果tripspot
是一个引用类型数组,您可能只需添加一个属性来引用相关的tripspot
条目(然后可以从中识别要显示的图像)。然后,viewForAnnotation
应该从您的自定义注释子类中检索该属性,而不是遍历tripspot
数组。此外,通过包含对基础tripspot
条目的引用,您现在还可以使用“确定选择详细信息附件”例程来了解与其关联的跳闸,并采取相应的操作。
顺便说一句,我不知道有多少潜在的注释,但在tripspot
数组中保存图像的名称可能更为谨慎,而不是图像本身。图像相对较大,如果您有大量注释,则可能会遇到内存问题。根据需要实例化UIImage
对象通常更为谨慎,而不是使用实际图像填充数组。