Frage

Ich brauche zwei verschiedene swipping Gesten fangen UISwipeGestureRecognizer (zum Beispiel UISwipeGestureRecognizerDirectionRight und UISwipeGestureRecognizerDirectionLeft). Wenn ich hinzufügen, zwei verschiedene recognisers mit addGestureRecognizer Methode, erst letzten Erkennungs Werken hinzugefügt. Ich habe gelesen, dass ich GestureRecognizer implementieren müssen: shouldRecognizeSimultaneouslyWithGestureRecognizer:. Methode der UIGestureRecognizerDelegate Protokoll, aber nichts funktioniert

Kann mir jemand helfen mit einfachen Beispiel fangen zwei oder mehr gleichen Gesten? Dank!

War es hilfreich?

Lösung

Es war wirklich einfach:

Zunächst sollten wir Klasse erstellen, dass Geräte UIGestureRecognizerDelegate Protokoll:

@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate>

@implementation MyGestureDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    return YES;
}

Und es wie folgt verwendet werden:


    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc]
                                              initWithTarget:self action:@selector(handleSwipeGestureLeft:)];
    [self.view addGestureRecognizer:swipeGestureLeft];
    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [swipeGestureLeft release];

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleSwipeGesture:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGesture];

    MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init];

    [swipeGesture setDelegate:deleg];
    [swipeGesture release];

Andere Tipps

Die Antwort: „Um, ein kurzer Blick auf die Dokumentation ...“ von Phoenix absolut nicht funktionieren!

Er setzt eine Maske, dann die gleiche Variable-Test, als ob die Erkennungs es gelöscht und setzen ein einzelnes Bit. Es speichert, wie er richtig aus der Dokumentation zitiert:

  

Die zulässigen Richtungen der Swipe

sender.direction

wird einfach gibt die Maske, die Sie zunächst und in seinem Beispiel gesetzt ist, wird nie auf eine einzige Richtung lösen!

UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3

Additionaly, für die meisten Fälle, die Sie brauchen nicht zu:

  • setup ein Delegierter
  • erlaubt gleichzeitige Gestenerkennung (es sei denn, Sie gleichzeitige klauen wollen, nicht wahrscheinlich)
  • senden, um die Erkennungs an den Wähler

Die folgenden Werke für mich:

   UISwipeGestureRecognizer* swipe;

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionLeft;
   [view addGestureRecognizer:swipe];

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionRight; // default
   [view addGestureRecognizer:swipe];

Um, ein kurzer Blick auf die Dokumentation würde zeigen, dass Sie mehr Art und Weise der Arbeit tun, als Sie brauchen:

"Richtung Die zulässigen Richtungen der Swipe.

@property(nonatomic) UISwipeGestureRecognizerDirection direction

Diskussion Sie können mehrere Richtungen angeben, indem mehr UISwipeGestureRecognizerDirection Konstanten Angabe mit bitweise OR-Operanden. Die Standardrichtung ist UISwipeGestureRecognizerDirectionRight. "

Was ist zu sagen, anstatt zwei UISwipeGestureRecognizers zu verwenden, können Sie nur Folgendes tun:

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleSwipeGesture:)];

 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;

Und in der Aktionsmethode:

  -(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
     {
     if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {

         //do left action

     } else {

         //do right action

     }
}

Viel einfacher und viel weniger anfällig für Konflikte.

Ich würde vorschlagen, dass Sie ein wenig über die Technik gelesen, dass die Geste Erkenner verwenden, um die Geste zu erkennen. Ich nehme an, die ersten Erkennungs versucht, die Geste zu erkennen, aber erkennt, dass er nicht zu reagieren, um es nicht hat und dann irgendwie hat er es passiert nicht auf.

Es ist sehr nützlich zu lesen, wie sie arbeiten, um zu verstehen, wie sie verwenden.

Hope, das hilft.

Dank user294890 Vorschlag, ich war erfolgreich, indem sie ja aus den aufgelisteten UIGestureRecognizerDelegate Methoden zurück.

fand ich jedoch, dass es nicht funktionieren würde, wenn ich die GestureRecognizer wurde hinzugefügt, bevor die Web-Ansicht geladen hatte. Es dauerte jedoch funktionieren, wenn ich die GestureRecognizer zum webView im webView Delegatmethode hinzugefügt:

- (void)webViewDidFinishLoad:(UIWebView *)webView.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top