2010-04-13 11 views
24

Devo rilevare due diversi gesti di sweepping utilizzando UISwipeGestureRecognizer (ad esempio, UISwipeGestureRecognizerDirectionRight e UISwipeGestureRecognizerDirectionLeft). Quando aggiungo due diversi riconoscitori con il metodo addGestureRecognizer, funziona solo l'ultimo riconoscimento aggiunto. Ho letto che ho bisogno di implementare gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: metodo del protocollo UIGestureRecognizerDelegate, ma non funziona.Riconoscimento di gesture simultanei in Iphone SDK

Qualcuno può aiutare con un semplice esempio di cattura di due o più stessi gesti? Grazie!

risposta

33

'stato davvero facile:

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

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

+1

Thx. Utilizzato solo questo per far sì che UIPanGestureRecognizer e UIPinchGestureRecognizer lavorino insieme nella stessa vista. – Hafthor

+1

per implementare UIGestureRecognizerDelegate nel codice sopra utilizzare questo codice @interfaccia MyGestureDelegate: NSObject ps. Grazie per il suggerimento ... –

+0

Non capisco: è corretto che solo uno dei due Riconoscitori è assegnato a un delegato? – Sjakelien

1

Suggerirei di leggere un po 'sulla tecnica utilizzata dai riconoscitori di gesti per riconoscere il gesto. Suppongo che il primo riconoscitore cerchi di riconoscere il gesto, ma si rende conto che non deve rispondere ad esso e quindi in qualche modo non lo trasmette.

È molto utile leggere come funzionano per capire come usarli.

Spero che questo aiuti.

+0

Penso che sia così e ci sono tali informazioni su developer.apple.com: "Per impostazione predefinita, non è possibile tentare di riconoscere simultaneamente i loro gesti. Tuttavia, è possibile modificare questo comportamento implementando gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer :, an metodo facoltativo del protocollo UIGestureRecognizerDelegate: questo metodo viene chiamato quando il riconoscimento del riconoscimento gesto ricevente bloccherebbe l'operazione del riconoscitore di gesti specificato o viceversa. Ritorna SÌ per consentire a entrambi i riconoscitori di gesti di riconoscere i loro gesti contemporaneamente. " – user294890

2

Um, una rapida occhiata alla documentazione rivelerebbe che stai facendo molto più lavoro del necessario:

"direzione Le direzioni consentite del passaggio.

@property(nonatomic) UISwipeGestureRecognizerDirection direction 

Discussione È possibile specificare più direzioni specificando multipla UISwipeGestureRecognizerDirection costanti 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 incline al conflitto

+1

Il commentatore di seguito è corretto. Questo non funzionerà come pubblicizzato. Avrei dovuto controllare il mio lavoro con più attenzione! Dò la colpa ai brillamenti solari che fanno esplodere le mie onde cerebrali ... Sì, è tutto, bagliori solari ... o qualcosa del genere ... – Phoenix

20

La risposta: "Uhm, una rapida occhiata alla documentazione ..." da Phoenix abso Sinceramente non funzionerà!

Sta impostando una maschera, quindi utilizzando la stessa variabile per testare come se il riconoscitore lo avesse cancellato e impostato un singolo bit.Memorizza, 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 un direzione unica!

UISwipeGestureRecognizerDirectionRight == 1 
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3 

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

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

Le 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]; 
+0

Sì, implementando la direzione del gesto individualmente e assegnandoli a metodi separati funziona bene per me. Un po 'stupido, ma funziona. – GeneCode

+0

Questa risposta ha risolto il mio problema, anche se sento che la risposta di Phoenix DOVREBBE funzionare. Stupido che non sia così. – RyJ

0

Grazie al suggerimento dell'utente294890, ho avuto esito positivo restituendo sì dai metodi elencati UIGestureRecognizerDelegate.

Ho trovato tuttavia che non avrebbe funzionato quando aggiungevo GestureRecognizer prima che la visualizzazione web fosse caricata. Funzionava tuttavia quando ho aggiunto GestureRecognizer alla webView nel metodo delegato webView:

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