swift mapkit 注释重复相同的 CalloutAccessoryView 图像
swift mapkit annotations repeating the same CalloutAccessoryView image
我尝试制作一个带有注释的简单地图,但是当我尝试 运行 它时,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
}
感谢任何建议。
您不应遍历 viewForAnnotation
中 tripSpot
的整个数组。此方法适用于特定注释,但其编写方式将重复设置(并重置)每个注释的详细信息附件为 tripspot
中每个 aSpot
的每个图像,有效地给出每个注释都与最后一个 tripspot
具有相同的细节附件(并且效率低下)。
相反,使您的注释成为 MKPointAnnotation
的子类并添加 属性 以便它知道给定注释使用哪个图像。如果 tripspot
是一个引用类型数组,您可能只需添加一个 属性 来引用相关的 tripspot
条目(然后它可以从中识别要显示的图像)。然后,viewForAnnotation
应该从您的自定义注释子类中检索 属性,而不是遍历 tripspot
数组。此外,通过包含对基础 tripspot
条目的引用,您现在还可以让 "did select detail accessory" 例程知道它与哪个旅行点相关联,并采取适当的行动。
顺便说一句,我不知道有多少潜在的注释,但将图像名称保存在 tripspot
数组中而不是图像本身可能更为谨慎。图像相对较大,如果您有很多注释,则可能会 运行 出现内存问题。通常更谨慎的做法是根据需要实例化 UIImage
对象,而不是用实际图像填充数组。
我尝试制作一个带有注释的简单地图,但是当我尝试 运行 它时,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
}
感谢任何建议。
您不应遍历 viewForAnnotation
中 tripSpot
的整个数组。此方法适用于特定注释,但其编写方式将重复设置(并重置)每个注释的详细信息附件为 tripspot
中每个 aSpot
的每个图像,有效地给出每个注释都与最后一个 tripspot
具有相同的细节附件(并且效率低下)。
相反,使您的注释成为 MKPointAnnotation
的子类并添加 属性 以便它知道给定注释使用哪个图像。如果 tripspot
是一个引用类型数组,您可能只需添加一个 属性 来引用相关的 tripspot
条目(然后它可以从中识别要显示的图像)。然后,viewForAnnotation
应该从您的自定义注释子类中检索 属性,而不是遍历 tripspot
数组。此外,通过包含对基础 tripspot
条目的引用,您现在还可以让 "did select detail accessory" 例程知道它与哪个旅行点相关联,并采取适当的行动。
顺便说一句,我不知道有多少潜在的注释,但将图像名称保存在 tripspot
数组中而不是图像本身可能更为谨慎。图像相对较大,如果您有很多注释,则可能会 运行 出现内存问题。通常更谨慎的做法是根据需要实例化 UIImage
对象,而不是用实际图像填充数组。