我正在尝试在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的几个相关问题,您可能会发现有帮助: