Utilizzando UIView e UITapGestureRecognizer invece di 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")
}
Quando si fa clic su rightCalloutAccessoryView
, saranno chiamati solo didClickGestureRecognizer
, ma il vostro calloutAccessoryControlTapped
non può essere invocato nessuno.
2. Se si dispone di un UIControl come rightCalloutAccessoryView
, è possibile toccare direttamente sul MKAnnotationView.Otherwise MKAnnotationView non può essere sfruttato.
Sia il selettore e calloutAccessoryControlTapped
saranno chiamati quando si tocca rightCalloutAccessoryView
o toccare direttamente MKAnnotationView
3. Se si dispone di un UIControl come leftCalloutAccessoryView
, sia la vostra selezione e calloutAccessoryControlTapped
verrà chiamato quando si è toccato su di esso.
4. A partire da iOS 9, è possibile avere un detailCalloutAccessoryView
in MKAnnotationView. Solo il tuo selettore verrà chiamato quando lo hai toccato.
5. Inoltre è possibile creare il proprio MKAnnotationView personalizzato e modificarne i comportamenti.
Grazie per la risposta. Non c'è modo di utilizzare solo il metodo delegate calloutAccessoryControlTapped? –
Non conosco un altro modo. Se si guarda al codice sorgente Apple lo stanno facendo allo stesso modo. – Ramis