我已经创建了一张地图上有大量针脚的地图,点击一个图钉会弹出默认的“气泡”,现在就可以了。
我真正想要做的不是弹出泡泡而是调用不同的功能。我的所有搜索都导致人们想要创建具有不同视图的新自定义注释,这样,我只想调用一个函数,我不确定在哪里尝试调用它。我对ios开发很新,这看起来应该很简单,但我发现通常情况并非如此。
答案 0 :(得分:5)
首先,值得注意的是,标准用户体验会提供一个标注气泡,向用户显示足够的信息以确认这是预期的注释视图,然后让标注包括左侧和/或右侧附件视图(例如,标注左侧和/或右侧的按钮),然后用户可以使用该注释执行一些其他任务。请参阅位置和地图编程指南中的Creating Callouts。
但是如果你想在用户点击注释时立即做其他事情,那么设置你的注释视图,以便(a)它没有标注;然后(b)实施MKMapViewDelegate
方法didSelectAnnotationView
,以便在用户点击注释视图时执行您想要的任何任务。
例如,假设您为地图视图指定了delegate
,则可以在Swift 3/4中执行以下操作:
private let reuseIdentifier = "MyIdentifier"
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation { return nil }
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) as? MKPinAnnotationView
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
annotationView?.tintColor = .green // do whatever customization you want
annotationView?.canShowCallout = false // but turn off callout
} else {
annotationView?.annotation = annotation
}
return annotationView
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
// do something
}
或者在Swift 2中:
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation { return nil }
var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseIdentifier) as? MKPinAnnotationView
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
annotationView?.tintColor = UIColor.greenColor() // do whatever customization you want
annotationView?.canShowCallout = false // but turn off callout
} else {
annotationView?.annotation = annotation
}
return annotationView
}
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
// do something
}
答案 1 :(得分:3)
您可以通过在canShowCallout
上设置MKAnnotationView
属性来停止显示标注气泡。
anView!.canShowCallout = false
第二个实现didSelectAnnotationView
MapView的委托方法来处理引脚选择上的内容。你可以从didSelectAnnotationView
调用你的方法。
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)
{
//Pin clicked, do your stuff here
}
答案 2 :(得分:0)
雨燕5
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
}
extension MapViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
print("calloutAccessoryControlTapped")
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView){
print("didSelectAnnotationTapped")
}
}