Single Tap to MKMapView sin romper el zoom de doble toque

Quiero soltar un pin en mi MKMapView cuando el usuario hace MKMapView en el map. Tengo el código PIN funcionando, tengo un solo toque funcionando, pero cuando presiono dos veces para hacer zoom, primero presiono un solo toque. Aquí está mi código para get la configuration de los reconocedores:

  self.doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; self.doubleTap.numberOfTapsRequinetworking = 2; self.doubleTap.numberOfTouchesRequinetworking = 1; [mapView_ addGestureRecognizer:doubleTap_]; self.singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; self.singleTap.numberOfTapsRequinetworking = 1; self.singleTap.numberOfTouchesRequinetworking = 1; [self.singleTap requireGestureRecognizerToFail: doubleTap_]; [mapView_ addGestureRecognizer:singleTap_]; 

Ahora, esto no es sorprendente, para citar a Apple:

Nota: en el caso de los gestos de un solo toque versus un doble toque, si un reconocedor de gestos de un solo toque no requiere que el reconocedor de doble toque falle, debe esperar recibir sus acciones de un solo toque antes de pulsar dos veces acciones, incluso en el caso de un doble toque. Este es un comportamiento esperado y deseable porque la mejor experiencia de usuario generalmente implica acciones astackbles.

Entonces agregué requireGestureRecognizerToFail a mi reconocedor de un solo toque.

[singleTap requireGestureRecognizerToFail: doubleTap];

y esto asegura que mi reconocedor de un solo toque no obtenga doble toque.

Pero…

Ahora mi reconocedor de doble toque obtiene los dobles MKMapView y MKMapView no los obtiene. He intentado configurar cancelsTouchesInView a NO en el reconocedor, pero eso tampoco ayudó.

Por lo tanto, necesito una manera de evitar que mi reconocedor de un solo toque obtenga dobles tomas (lo que parece improbable) o para get mi evento de doble toque en mi mapView.

El código publicado parece funcionar bien como está en iOS 6.
El toque doble se maneja automáticamente con la vista del map sin interferir con el toque único.

En iOS 5.x, para que la vista del map ejecute su doble toque normal sin interferir con su toque único, aplique el método de delegado shouldRecognizeSimultaneouslyWithGestureRecognizer y devuelva YES (debe establecer la propiedad de delegate del gesto de doble toque solo reconocedor).

No estoy seguro de por qué esto no es necesario en iOS 6.

Trabajando perfectamente en iOS 8, la acción de doble toque es nula

  - (void)viewDidLoad { [super viewDidLoad]; UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil]; doubleTap.numberOfTapsRequinetworking = 2; doubleTap.numberOfTouchesRequinetworking = 1; [self.mapView addGestureRecognizer:doubleTap]; UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; singleTap.numberOfTapsRequinetworking = 1; singleTap.numberOfTouchesRequinetworking = 1; [singleTap requireGestureRecognizerToFail: doubleTap]; [self.mapView addGestureRecognizer:singleTap]; } - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state != UIGestureRecognizerStateEnded) return; //Do your work ... } 

Encontré esta publicación que me ayudó bastante …
Básicamente, necesitas encontrar el reconocedor de gestos de Apple y asegurarte de no competir con él.

La solución de Jonathan fue casi perfecta, excepto una cosa:
Dado que en iOS 7 MKView tiene todos sus gestos en una subvista. Es un poco conveniente si quieres distinguir cuáles son los tuyos (agregados directamente al MKMap) y cuáles son de Apple, pero podría romper en algún lugar en el futuro …

Lo que terminé haciendo fue repasar toda la subvista del map, con la esperanza de que sea lo suficientemente flexible como para soportar al less algunos cambios futuros …

Parece algo así:

 - (void) hackInTheGestureRecognizer { for (UIView *aSubview in [[self theMap] subviews]) { if ([aSubview isMemberOfClass:[UIView class]]) { for (UIGestureRecognizer *aRecognizer in [aSubview gestureRecognizers]) { if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { if ([(UITapGestureRecognizer *) aRecognizer numberOfTapsRequinetworking] == 2) { [[self singleTapRecognizer] requireGestureRecognizerToFail:aRecognizer]; } } } } } } 

Versión Swift 3 en iOS 10:

 // Gesture recognizer set up in Interface Builder @IBOutlet weak var singleTapRecognizer: UITapGestureRecognizer! override func viewDidLoad() { // double tap recognizer has no action let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: nil) doubleTapRecognizer.numberOfTapsRequinetworking = 2 doubleTapRecognizer.numberOfTouchesRequinetworking = 1 mapView.addGestureRecognizer(doubleTapRecognizer) singleTapRecognizer.require(toFail: doubleTapRecognizer) } 

Tenga en count que el solo toque se crea en IB. Podría crearse fácilmente en código como tal:

  let singleTapRecognizer = UITapGestureRecognizer(target: self, action: Selector("someAction")) singleTapRecognizer.numberOfTapsRequinetworking = 1 singleTapRecognizer.numberOfTouchesRequinetworking = 1 mapView.addGestureRecognizer(singleTapRecognizer)