我正在尝试在MKMapView的图钉上实现自定义注释视图。另一个用户为我提供了此功能,用于生成自定义的MKPinAnnotationView。 https://stackoverflow.com/users/3845091/zisoft

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
if annotation is PinAnnotation {
    let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")

    pinAnnotationView.pinColor = .Purple
    pinAnnotationView.draggable = true
    pinAnnotationView.canShowCallout = true
    pinAnnotationView.animatesDrop = true

    let deleteButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
    deleteButton.frame.size.width = 44
    deleteButton.frame.size.height = 44
    deleteButton.backgroundColor = UIColor.redColor()
    deleteButton.setImage(UIImage(named: "trash"), forState: .Normal)

    pinAnnotationView.leftCalloutAccessoryView = deleteButton

    return pinAnnotationView
}

return nil

}

然后,我会将需要的地图参数和要自定义的注释传递给该函数。即mapView(myMap, viewForAnnotation: point)
这一切都很好,并且很有意义,但是,当我尝试使用map.addAnnotation(mapView(myMap, viewForAnnotation: point))将MKPinAnnotationView添加到地图时,错误提示数据类型无效。有人知道如何使用自定义视图在地图上物理渲染图钉吗?

一个简单的解决方案永远是最好的。

谢谢!

最佳答案

在您的问题中,您谈到了viewForAnnotation方法:

然后我将我想要的地图参数传递给函数
以及我要自定义的注释。即mapView(myMap,
viewForAnnotation:点)

不,这是错误的。

不会将参数等传递给函数。

viewForAnnotation方法是您实现的委托方法,但不是您直接调用的

地图视图(MKMapView)将调用它并将参数传递给函数,等等。

viewForAnnotation委托方法中,您可以为给定的批注模型对象提供自定义视图

为确保地图视图调用您的委托方法,您必须:

  • 确保地图视图的delegate插座已连接到情节提要或
  • 中的视图控制器
  • 在代码中,通常在viewDidLoad中,执行mapView.delegate = self

  • 调用addAnnotation时,会向其传递注释模型对象(例如MKPointAnnotation或实现MKAnnotation协议的任何对象)。

    所以这行:
    map.addAnnotation(mapView(myMap, viewForAnnotation: point))
    

    应该是这样的:
    map.addAnnotation(point)
    
    MKPinAnnotationView对象(以及子类MKAnnotationView的任何对象)是某些注释模型对象的视图 -它们不是同一件事。

    这些问题和主题已经在iOS和MapKit文档中,SO以及其他地方的教程中多次涉及。

    以下是关于SO的几个相关问题,您可能会发现有帮助:
  • Stuck on using MKPinAnnotationView() within Swift and MapKit
  • viewForAnnotation confusion and customizing the pinColor iteratively
  • 08-28 22:00