2016-05-03 34 views

Odpowiedz

1

Aby to osiągnąć, musisz dodać cel dla odpowiedniego widoku akcesoriów. Możesz to osiągnąć, ustawiając przycisk na rightCalloutAccessoryView, jak pokazano w fragmencie kodu.

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

Dzięki za odpowiedź. Nie ma sposobu, aby użyć tylko metody delegate calloutAccessoryControlTapped? –

+1

Nie wiem inaczej. Jeśli zajrzysz do kodu źródłowego Apple, robią to w ten sam sposób. – Ramis

1
  1. Korzystanie UIView i UITapGestureRecognizer zamiast 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") 
    } 
    

    Po kliknięciu na rightCalloutAccessoryView tylko didClickGestureRecognizer zostanie wywołana, ale twój calloutAccessoryControlTapped nie można powoływać nikogo.

2.Jeżeli masz UIControl jako rightCalloutAccessoryView można dotknąć bezpośrednio na MKAnnotationView.Otherwise MKAnnotationView nie może być wykorzystany.
Zarówno selektor i calloutAccessoryControlTapped zostanie wywołana po dotknięciu rightCalloutAccessoryView lub dotknij bezpośrednio na MKAnnotationView

3.Jeżeli masz UIControl jak leftCalloutAccessoryView, zarówno swoją selektora i calloutAccessoryControlTapped zostanie wywołana gdy podsłuchu na nim.

4. Od wersji iOS 9 możesz mieć detailCalloutAccessoryView w swoim MKAnnotationView. Tylko twój selektor zostanie wywołany po stuknięciu w niego.

5.Można również utworzyć własny, niestandardowy widok MKAnnotationView i zmienić jego zachowanie.

Powiązane problemy