Подтвердить что ты не робот

Обнаружение на calloutAccessoryControlTapped только крана на rightCalloutAccessoryView

Мой calloutAccessoryControlTapped также вызывается, когда я просто нажимаю на аннотацию и это поведение правильно. Но как я могу определить, если пользователь нажал на правый вид аксессуаров (в моем случае кнопка раскрытия подробностей) , а не только в представлении?

Я добавил простую проверку, но она не работает.

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

}
4b9b3361

Ответ 1

Чтобы достичь этого, вам нужно добавить цель для правильного вида аксессуаров. Вы можете достичь этого, установив кнопку rightCalloutAccessoryView, как показано в фрагменте кода.

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 {

}

Ответ 2

  • Использование UIView и UITapGestureRecognizer вместо 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")
    }
    

    Когда вы нажимаете rightCalloutAccessoryView, вызывается только didClickGestureRecognizer, но ваш calloutAccessoryControlTapped не может быть вызван никому.

2.Если у вас UIControl как rightCalloutAccessoryView, вы можете напрямую нажать MKAnnotationView. В противном случае MKAnnotationView не может быть использован.
Как ваш селектор, так и calloutAccessoryControlTapped будут вызваны при нажатии rightCalloutAccessoryView или нажмите прямо на MKAnnotationView

3.Если у вас UIControl как leftCalloutAccessoryView, вы будете вызывать ваш селектор и calloutAccessoryControlTapped, когда вы нажмете на него.

4.Since iOS 9, вы можете иметь detailCalloutAccessoryView в своем MKAnnotationView. Только ваш селектор вызывается, когда вы на него нажимаете.

5. Также вы можете создать свой собственный MKAnnotationView и изменить его поведение.