我试图创建一个带有注释的简单映射,但是当我尝试运行它时,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
}
谢谢你的建议。
最佳答案
您不应该遍历tripSpot
中viewForAnnotation
的整个数组。这种方法是针对一个特定的注释的,但是在编写的过程中,它将重复设置(和重置)每个注释的细节附件,使其成为每个aSpot
中tripspot
的每个图像,有效地为每个注释提供与上一个tripspot
相同的细节附件(这样做效率很低)。
相反,将注释设为MKPointAnnotation
的子类并添加一个属性,以便它知道要将哪个图像用于给定的注释。如果tripspot
是一个引用类型数组,您可以添加一个属性来引用相关的tripspot
条目(然后它可以从中标识要显示的图像)。然后,viewForAnnotation
应该从自定义注释子类中检索该属性,而不是遍历tripspot
数组。此外,通过包含对基础tripspot
条目的引用,您现在还可以让“did select detail assemory”例程知道它与哪个tripspot关联,并采取适当的操作。
另外,我不知道有多少潜在的注释,但是将图像的名称保存在tripspot
数组中,而不是保存图像本身可能更为谨慎。图像相对较大,如果有大量注释,则可能会遇到内存问题。根据需要实例化UIImage
对象通常比用实际图像填充数组更为谨慎。