swift mapkit 注释重复相同的 CalloutAccessoryView 图像

标签 swift mapkit mapkitannotation

我尝试制作一个带有注释的简单 map ,但是当我尝试运行它时,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 条目的引用,您现在还可以让“选择详细信息附件”例程知道它与哪个 tripspot 相关联,并采取适当的操作。

顺便说一句,我不知道有多少潜在的注释,但将图像名称保存在 tripspot 数组中而不是图像本身可能更为谨慎。图像相对较大,如果您有很多注释,则可能会遇到内存问题。通常更谨慎的做法是根据需要实例化您的 UIImage 对象,而不是用实际图像填充数组。

关于swift mapkit 注释重复相同的 CalloutAccessoryView 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382916/

相关文章:

iphone - 获取 map 中点的坐标 - iPhone sdk

ios - 无法在 Swift 中显示 map 注释

ios - 我正在尝试在 map 工具包中使用 swift 3 在来自 API 的坐标(lat,long)上绘制折线,但无法制作折线

iOS MapKit - 是否可以根据 map 类型更改 map 图钉?

ios - 将所有 DNS 请求重定向到 iOS 应用程序中的自定义解析器

ios - 使用 CAShapeLayer 对蒙版部分的透明度进行动画处理

swift - 使用 alamofire 发送 base64 字符串

swift - 带有附加属性注入(inject)的工厂初始化

mapkit - 您如何让用户向 map 添加图钉并在 SwiftUI 中获取坐标?

objective-c - MKCoordinateRegion 是跨越中心到边界还是边界到边界?