Domanda

Ho bisogno di prendere due diversi gesti swipping usando UISwipeGestureRecognizer (ad esempio, UISwipeGestureRecognizerDirectionRight e UISwipeGestureRecognizerDirectionLeft). Quando aggiungo due riconoscitori diversi con addGestureRecognizer metodo, opere Riconoscimento solo lo scorso aggiunto. Ho letto che ho bisogno di implementare gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:. Metodo di protocollo UIGestureRecognizerDelegate, ma non funziona niente

chiunque aiutare Can con un semplice esempio di cattura di due o più stessi gesti? Grazie!

È stato utile?

Soluzione

E 'stato davvero facile:

In un primo momento dovremmo creare di classe, che implementa il protocollo UIGestureRecognizerDelegate:

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

E usare in questo modo:


    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];

Altri suggerimenti

La risposta: "Um, un rapido sguardo alla documentazione ..." da Phoenix assolutamente non funzionerà!

Si sta creando una maschera, quindi utilizzando la stessa variabile di test come se il sistema di riconoscimento riesce e impostare un singolo bit. Consente di archiviare, come ha correttamente citato dalla documentazione:

  

Le direzioni consentite del colpo

sender.direction

sarà semplicemente restituire la maschera si imposta inizialmente e nel suo esempio, non sarà mai risolto in una sola direzione!

UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3

Additionaly, per la maggior parte dei casi non è necessario:

  • installazione di un delegato
  • permette il riconoscimento dei gesti simultanea (a meno che non si desidera colpi simultanei, non probabile)
  • inviare il riconoscitore al selettore

I seguenti opere per me:

   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, un rapido sguardo alla documentazione avrebbe rivelato che si sta facendo molto più lavoro di quanto è necessario:

"direzione Il permesso direzioni del colpo.

@property(nonatomic) UISwipeGestureRecognizerDirection direction

Discussione È possibile specificare più direzioni specificando più costanti UISwipeGestureRecognizerDirection utilizzando bit-O operandi. La direzione di default è UISwipeGestureRecognizerDirectionRight ".

vale a dire, invece di utilizzare due UISwipeGestureRecognizers, si può solo fare quanto segue:

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

 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;

E nel tuo metodo di azione:

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

         //do left action

     } else {

         //do right action

     }
}

Molto più semplice, e molto meno inclini al conflitto.

vorrei suggerire di leggere un po 'sulla tecnica che i sistemi di riconoscimento gesto utilizzano per riconoscere il gesto. Suppongo che, i primi tentativi Riconoscimento di riconoscere il gesto, ma si rende conto che lui non deve rispondere ad esso e quindi in qualche modo lui non lo dia.

E 'molto utile leggere come funzionano per capire come usarli.

Spero che questo aiuti.

Grazie al suggerimento di user294890, ho avuto successo con il ritorno sì dai metodi UIGestureRecognizerDelegate elencati.

Ho trovato, tuttavia, che non avrebbe funzionato quando stavo aggiungendo il GestureRecognizer prima della visualizzazione Web aveva caricato. Essa ha tuttavia funzionato quando ho aggiunto il GestureRecognizer alla WebView nel metodo WebView delegato:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top