2016-05-03 9 views
12

Il mio calloutAccessoryControlTapped viene chiamato anche quando toccherò semplicemente la vista annotazione e this behavior it's right. Ma come posso rilevare se l'utente ha toccato la vista accessorio giusta (nel mio caso un pulsante di divulgazione dei dettagli) e non solo nella vista?Rileva su calloutAccessoryControlTappato solo il tocco su rightCalloutAccessoryView

Ho aggiunto un controllo semplice ma non funziona.

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 
     } 
    } 

} 

risposta

1

Per realizzarlo è necessario aggiungere il target per la visualizzazione degli accessori corretta. Puoi ottenerlo impostando il pulsante su rightCalloutAccessoryView come mostrato nello snippet di codice.

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

Grazie per la risposta. Non c'è modo di utilizzare solo il metodo delegate calloutAccessoryControlTapped? –

+1

Non conosco un altro modo. Se si guarda al codice sorgente Apple lo stanno facendo allo stesso modo. – Ramis

1
  1. 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.

Problemi correlati