2012-11-26 8 views
8

Ich möchte einen Pin auf meinem MKMapView fallen lassen, wenn der Benutzer nur auf die Karte klopft. Ich habe den PIN-Code funktioniert, ich habe den einzelnen Tipp funktioniert, aber wenn ich doppelt tippen, um zu zoomen, bekomme ich einen einzigen Tipp zuerst. Hier ist mein Code ist den Erkenner Setup zu bekommen:Single Tippen Sie auf MKMapView ohne zu brechen Doppeltippen Zoom

self.doubleTap = [[UITapGestureRecognizer alloc] 
         initWithTarget:self action:@selector(handleDoubleTap:)]; 
    self.doubleTap.numberOfTapsRequired = 2; 
    self.doubleTap.numberOfTouchesRequired = 1; 
    [mapView_ addGestureRecognizer:doubleTap_]; 

    self.singleTap = [[UITapGestureRecognizer alloc] 
         initWithTarget:self action:@selector(handleGesture:)]; 
    self.singleTap.numberOfTapsRequired = 1; 
    self.singleTap.numberOfTouchesRequired = 1; 
    [self.singleTap requireGestureRecognizerToFail: doubleTap_]; 
    [mapView_ addGestureRecognizer:singleTap_]; 

Nun ist dies nicht überraschend, zu zitieren Apple:

Hinweis: Im Fall des Einzel Hahn gegen Doppel-Tap Gesten, wenn Ein One-Tap-Gestenerkenner erfordert nicht die Doppeltipp- Erkennung zu scheitern, sollten Sie erwarten, Ihre One-Tap-Aktionen vor Ihrer Doppeltipp-Aktionen, auch im Falle einer Doppel tippen Sie auf. Dies ist ein erwartetes und wünschenswertes Verhalten, da die beste Benutzererfahrung im Allgemeinen mit stapelbaren Aktionen verbunden ist.

Also habe ich requireGestureRecognizerToFail zu meinem single tap recognizer hinzugefügt.

[singleTap requireGestureRecognizerToFail: doubleTap];

und dies stellt sicher, dass mein single tap recognizer nicht doppelt klopft.

Aber ...

Nun meine Doppel-Tippen Erkenner bekommt die Doppelhähne und MKMapView hat sie nicht bekommen. Ich habe versucht, cancelsTouchesInView zu NO im recognizer einzustellen, aber das half auch nicht.

Also muss ich entweder verhindern, dass mein Single Tap Recognizer doppelt klopft (was unwahrscheinlich erscheint) oder mein Double Tap Event auf mein mapView bekommen.

+0

Können Sie den Code anzeigen, den Sie verwenden, um die Gestenerkennung hinzuzufügen? Mit welcher iOS-Version testeest du? Haben Sie versucht, YES von der Delegate-Methode shouldRecognizeSimultouslyWithGestureRecognizer zurückzugeben? – Anna

+0

Frage bearbeitet, um mehr Code zu haben. Ich teste mit iOS5.1. Habe den Delegierten-Befehl shouldRecognizeSimultouslyWithGestureRecognizer noch nicht ausprobiert, das mache ich jetzt. –

+0

shouldRecognizeSimultanelyWithGestureRecognizer = YES hat den Trick gemacht, mache das eine Antwort und ich werde es als die richtige markieren. Vielen Dank! –

Antwort

2

Der Code geschrieben scheint in iOS 6 gut zu funktionieren.
Der Doppeltipp wird automatisch von der Kartenansicht behandelt, ohne den Single-Tap zu stören.

In iOS 5.x, die Kartenansicht zu bekommen seine normale Doppeltippen Umgang mit einem einzigen Abgriff ohne Störung auszuführen, implementieren die shouldRecognizeSimultaneouslyWithGestureRecognizer Delegatmethode und das Rück YES von ihm (müssen die delegate Eigenschaft der einzustellen Doppel-Finger-Gestenerkennung).

nicht sicher, warum dies in iOS nicht notwendig ist, 6.

0

ich this post gefunden, die mir sehr viel geholfen ...
Grundsätzlich benötigen Sie Apple Gestenerkenner zu finden, und stellen Sie sicher, dass Sie dies nicht tun konkurrieren mit ihm.

Jonathans Lösung war fast perfekt, außer einer Sache:
Da in iOS 7 MKView alle Gesten in einer Unteransicht hat. Es ist ein bisschen praktisch, wenn Sie unterscheiden wollen, welche Ihrer sind (direkt zur MKMap hinzugefügt) und welche von Apple, aber es könnte irgendwo in der Zukunft brechen ....

Was ich am Ende getan habe, war über alle zu gehen Unteransicht der Karte, in der Hoffnung, dass sie flexibel genug ist, um zumindest einigen zukünftigen Änderungen standzuhalten ...

Sieht so etwas:

- (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 numberOfTapsRequired] == 2) { 

         [[self singleTapRecognizer] requireGestureRecognizerToFail:aRecognizer]; 
        } 
       } 
      } 
     } 
    } 
} 
4

funktionierend auf iOS 8, Doppel-Tippen Aktion null ist

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil]; 
     doubleTap.numberOfTapsRequired = 2; 
     doubleTap.numberOfTouchesRequired = 1; 
     [self.mapView addGestureRecognizer:doubleTap]; 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
     singleTap.numberOfTapsRequired = 1; 
     singleTap.numberOfTouchesRequired = 1; 
     [singleTap requireGestureRecognizerToFail: doubleTap]; 
     [self.mapView addGestureRecognizer:singleTap]; 
    } 

    - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer 
    { 
      if (gestureRecognizer.state != UIGestureRecognizerStateEnded) 
       return; 
      //Do your work ... 
    } 
+0

Dies sollte die akzeptierte Antwort sein. –

0

Swift 3-Version auf 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.numberOfTapsRequired = 2 
    doubleTapRecognizer.numberOfTouchesRequired = 1 
    mapView.addGestureRecognizer(doubleTapRecognizer) 

    singleTapRecognizer.require(toFail: doubleTapRecognizer) 
} 

Beachten Sie, dass Der einzelne Tap wird in IB erstellt. Es könnte leicht in Code wie folgt erstellt werden:

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