2016-05-03 10 views
12

Meine calloutAccessoryControlTapped wird auch aufgerufen, wenn ich nur auf Anmerkungsansicht und this behavior it's right tippen. Aber wie kann ich erkennen, ob der Benutzer auf die richtige Zubehöransicht geklickt hat (in meinem Fall eine detaillierte Offenlegungstaste) und nicht nur in der Ansicht?Detect on CalloutAccessoryControlTapped nur das Tippen auf RightCalloutAccessoryView

Ich habe eine einfache Überprüfung hinzugefügt, aber es funktioniert nicht.

import UIKit 
import MapKit 

extension MapVC: MKMapViewDelegate, CLLocationManagerDelegate 
{  
    func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) 
    { 
     if control == view.rightCalloutAccessoryView 
     { 
      ... // enter here even if I tapped on the view annotation and not on button 
     } 
    } 

} 

Antwort

1

Um dies zu erreichen, müssten Sie ein Ziel für die richtige Zubehöransicht hinzufügen. Sie können es erreichen, indem Sie die Schaltfläche auf rightCalloutAccessoryView wie im Code-Snippet gezeigt einstellen.

class MapViewController: UIViewController, MKMapViewDelegate { 

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
     if annotation is Annotation { 
      let annotationView = AnnotationView(annotation: annotation, reuseIdentifier: "reuseIdentifier") 
      let rightButton = UIButton(type: .DetailDisclosure) 
      rightButton.addTarget(self, action: #selector(didClickDetailDisclosure(_:)), forControlEvents: .TouchUpInside) 
      annotationView.rightCalloutAccessoryView = rightButton 
     } 
     return nil 
    } 

    func didClickDetailDisclosure(button: UIButton) { 
     // TODO: Perform action when was clicked on right callout accessory view. 
    } 
} 

// Helper classes. 
class Annotation: NSObject, MKAnnotation { 
    var coordinate: CLLocationCoordinate2D 
    var title: String? 
    var subtitle: String? 

    init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String) { 
     self.coordinate = coordinate 
     self.title = title 
     self.subtitle = subtitle 
    } 
} 

class AnnotationView: MKAnnotationView { 

} 
+0

Danke für die Antwort. Es gibt keine Möglichkeit, nur die Delegate-Methode calloutAccessoryControlTapped zu verwenden? –

+1

Ich kenne keinen anderen Weg. Wenn Sie in Apple-Quellcode schauen, tun sie es auf die gleiche Weise. – Ramis

1
  1. Mit UIView und UITapGestureRecognizer statt UIControl

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
        let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "reuseIdentifier") 
        let gestureView = UIView(frame:CGRect(x: 0,y: 0,width: 20,height: 20)) 
        let gestureRecognizer = UITapGestureRecognizer() 
        gestureRecognizer.addTarget(self, action: #selector(MapViewController.didClickGestureRecognizer(_:))) 
    
        gestureView.addGestureRecognizer(gestureRecognizer) 
        gestureView.backgroundColor = UIColor.redColor() 
        annotationView.rightCalloutAccessoryView = gestureView 
        return annotationView 
    }  
    
    func didClickGestureRecognizer(sender:UITapGestureRecognizer) -> Void { 
        print("didClickGestureRecognizer") 
    } 
    

    Wenn Sie auf rightCalloutAccessoryView klicken, wird nur didClickGestureRecognizer wird aufgerufen, aber Ihre calloutAccessoryControlTapped niemanden aufgerufen werden kann.

2. Wenn Sie einen UIControl als rightCalloutAccessoryView haben, können Sie direkt auf MKAnnotationView.Otherwise MKAnnotationView tippen kann nicht abgegriffen werden.
Sowohl Ihre Wähler und calloutAccessoryControlTapped wird aufgerufen, wenn Sie rightCalloutAccessoryView tippen oder tippen Sie direkt auf MKAnnotationView

3. Wenn Sie einen UIControl als leftCalloutAccessoryView haben, sowohl Ihre Wähler und calloutAccessoryControlTapped wird aufgerufen, wenn Sie darauf geklopft.

4.Seit iOS 9 können Sie eine detailCalloutAccessoryView in Ihrem MKAnnotationView.Only Ihre Auswahl wird aufgerufen, wenn Sie darauf geklopft haben.

5. Sie können auch Ihre eigene benutzerdefinierte MKAnnotationView erstellen und ihr Verhalten ändern.