2012-07-07 13 views
6

Aggiungo il seguente codice nel metodo onEnter.Aggiunta di più UITapGestureRecognizers a visualizzazione singola (Cocos2d)

doubleTapRecognizer_ = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; 
    doubleTapRecognizer_.numberOfTapsRequired = 2; 
    doubleTapRecognizer_.cancelsTouchesInView = NO; 
    [[[CCDirector sharedDirector] view] addGestureRecognizer:doubleTapRecognizer_]; 

ho più istanze di questa classe, ma l'unico che ottiene di selettore di chiamata è l'ultima istanza aggiunto. Lo UIView Class Reference mi porta a credere che sia possibile aggiungere più di un UIGestureRecognizer a una singola vista. La proprietà "gestureRecognizers" restituisce un NSArray.

Infatti ho già un UIPanGestureRecognizer che lavora con la stessa vista di un'altra classe. Quindi sto ottenendo almeno due UIGestureRecognizers per funzionare contemporaneamente.

risposta

11

È possibile aggiungere più riconoscitori di gesti alla stessa vista. Quello che non puoi (facilmente) fare è aggiungere più istanze dello stesso tipo di riconoscimento gestuale (panoramica, scorrimento, doppio tocco, ecc.) Alla stessa vista.

Perché?

Perché non appena il primo riconoscitore di gesti riconosce il gesto (doppio tocco in questo caso) annulla tutti gli eventi di tocco. Pertanto i restanti riconoscitori di gesti non finiranno mai di essere riconosciuti e non licenzieranno mai i loro eventi.

Non è necessario più di un riconoscitore di gesti dello stesso tipo. Nel tuo caso, una volta ricevuto l'evento di doppio tocco, spetta a te segnalare l'oggetto giusto che è stato toccato due volte. Usa la posizione del riconoscitore e altri attributi per trovare, ad esempio, lo sprite che è stato toccato due volte e poi farlo fare tutto ciò che deve fare.

Per questo motivo è buona norma che i gesti vengano riconosciuti da un nodo di livello superiore nella gerarchia di scene (ovvero il livello dell'interfaccia utente) che quindi passa gli eventi ai nodi appropriati o semplicemente lo ignora.

+0

La tua soluzione suona bene e sarà facile da implementare, ma per il gusto di imparare qual è il punto di doubleTapRecognizer_.cancelsTouchesInView = NO; Non dovrebbe disattivare l'annullamento del tocco? –

2

Per aggiungere più di un UIGestureRecognizer sulla stessa vista, è necessario impostare la proprietà delegate dei sistemi di riconoscimento dei gesti aggiunti sulla vista e implementare il seguente metodo nel delegato:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

By come sopra, puoi aggiungere più riconoscimenti di gesti sulla stessa vista, indipendentemente dal fatto che i riconoscitori di gesti siano dello stesso tipo o meno.

Ad esempio, è possibile aggiungere due UITapGestureRecognizer nella stessa vista e verranno richiamati i richiami dei due riconoscitori di gesti. E l'ultimo callback aggiunto verrà chiamato prima.

Spero che questo aiuti.

+0

A volte abbiamo davvero bisogno di aggiungere un secondo riconoscitore di gesti dello stesso tipo con un riconoscitore di gesti già esistente. Ad esempio, per un 'MKMapView', c'è già un gesto di pizzico su di esso, e voglio fare qualche altra cosa quando faccio lo zoom della mappa facendo un pizzico di gesto. In questo caso, ho bisogno di aggiungere un altro indicatore di pizzicamento su "MKMapView" e contemporaneamente far funzionare il meccanismo di riconoscimento del pizzico esistente. – HongchaoZhang