如何使整个 MKPinAnnotationView 可点击,而不仅仅是正确的附件视图

Bar*_*zyk 4 mapkit ios swift

在以下方法中MKMapViewDelegate:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {

    let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "")
    pinAnnotationView.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure)
    pinAnnotationView.canShowCallout = true

    return pinAnnotationView
}
Run Code Online (Sandbox Code Playgroud)

如果我像上面那样做,那么整个视图都是可点击的:

在此处输入图片说明

除此以外:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {

        let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "")
        let accessoryView = UIButton(frame: CGRectMake(0, 0, 25, 25))
        accessoryView.setImage(UIImage(named: "icon-menu"), forState: .Normal)

        pinAnnotationView.rightCalloutAccessoryView = accessoryView
        pinAnnotationView.canShowCallout = false

        return pinAnnotationView
}
Run Code Online (Sandbox Code Playgroud)

只有右附件视图被点击,为什么?

问题是。怎么做才能使整体可点击MKPinAnnotationView而不仅仅是正确的披露?

Nav*_*H S 5

我仍在寻找为什么这适用于第一个代码块中的完整标注视图,但不适用于第二个代码块。

我找到了如何使整个 MKPinAnnotationView 标注视图可点击的答案。

基本上我们可以通过两种方法实现这一点。

1.使用正常方法。

在这里,我为rightCalloutAccessoryView使用了一个图像,但是在声明如下按钮时有一些小的变化。

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
    let reuseIdentifier = "pin"
    var pin = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseIdentifier) as? MKPinAnnotationView
    if pin == nil {
        pin = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
        pin!.pinTintColor = UIColor.redColor()
        pin!.canShowCallout = true
        let button = UIButton(type: .DetailDisclosure)
        button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
        button.setBackgroundImage(UIImage(named: "img.png"), forState: .Normal)
        pin!.rightCalloutAccessoryView = button
    } else {
        pin!.annotation = annotation
    }
    return pin
}
Run Code Online (Sandbox Code Playgroud)

在此处声明 Button 时,我将其指定为DetailDisclosure类型。

2. 第二种方法是使用 UITapGestureRecognizer

在这里,我实现了两个标注委托方法,如下所示。

//called when select an annotation
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped))
    view.addGestureRecognizer(tapGestureRecognizer)
}
//Called when deselects the annotation
func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) {
    view.removeGestureRecognizer(view.gestureRecognizers!.first!)
}
func tapped(sender: UITapGestureRecognizer) {
    if let view = sender.view as? MKAnnotationView {
        performSegueWithIdentifier("info", sender: view)
        //do yours
    }
}
Run Code Online (Sandbox Code Playgroud)