2009-06-13 7 views
7

Sto cercando di distinguere tra due (o più) oggetti UITouch sull'iPhone. In particolare, mi piacerebbe sapere l'ordine in cui si sono verificati i tocchi.Differenziazione tra oggetti UITouch su iPhone

Ad esempio, nel mio -touchesBegan: withEvent: metodo Ottengo un NSSet di oggetti UITouch. Ora posso scoprire quanti tocchi ci sono, ma quale oggetto rappresenta quale dito?

Ho notato la proprietà di timestamp su UITouch - è questo quello che sto cercando? Vedo come sarebbe utile ottenere l'ultimo o il primo tocco - a condizione che i tocchi non mutino ...

Qui sta il mio problema. Posso usare il timestamp per individuare il tocco più recente, ma poi il tocco che si è verificato prima e l'IT diventa l'ultimo tocco ...

Alla fine di questo esercizio, vorrei essere in grado di implementare il gesto "pizzica" per ingrandire o ridurre, ecc.

Qualsiasi aiuto sarebbe molto apprezzato, grazie.

risposta

3

Ho alcuni esempi di codice tocco qui:

http://github.com/kailoa/6tringle-touchsamplecode/tree/master http://6tringle.com/blog/2009/TouchSampleCode.html

E 'stato utile per alcune persone, e penso che potrebbe aiutarvi.

Dai uno sguardo allo NSMutableArray *ActiveTouches. È la raccolta che uso per tenere traccia dell'ordine in cui si verificano i tocchi.

C'è un esempio di pizzico ed allungamento in quel codice base che usa quella matrice.

+0

Grazie, darò un'occhiata quando avrò un po 'di tempo. – Jasarien

+0

In che modo l'array activeTouches è diverso da quello che il sistema conserva per te in [event touchesForView: self]? –

2

La soluzione, spesso discussa, è quella di guardare gli eventi e confrontare i valori attuali di xey ye x e y precedenti per abbinarli. Sembra che ci siano alcuni trucchi. Gli eventi possono venire fuori ordine e ho visto casi in cui sembrava che l'hardware o il sistema operativo si confondessero con un sacco di (10) dita mobili.

Alcune persone hanno sottolineato che gli eventi tattili vengono riutilizzati e che è possibile utilizzarli per tenere traccia di quale dito è quale. Questo è stato trattato almeno una volta su StackOverflow, credo.

23

Ogni dito ottiene un oggetto UITouch, e lo stesso oggetto è dato a voi ancora e ancora . Basta ricordare i puntatori per impostare gli oggetti UITouch iniziali e fare un confronto tra puntatori per tenere traccia delle dita.

Dalla documentazione di riferimento di Apple:

Un oggetto tocco è persistente per un dato dito durante una sequenza, e UIKit muta come tiene traccia del dito durante esso. Gli attributi tattili che cambiano sono la fase del tocco, la sua posizione in una vista, la sua posizione precedente e il suo timestamp. Il codice di gestione degli eventi valuta questi attributi per determinare come rispondere all'evento.

+0

La documentazione pertinente è attualmente disponibile qui http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html#//apple_ref/doc/uid/TP40009541-CH3-SW14 (se l'URL non funziona, consulta la "Guida alla gestione degli eventi per iOS" in "Eventi multitouch - Gestione di eventi multitouch - Gestione di una sequenza multitouch complessa") – Piku

2

Ho dato un'occhiata al codice di Kailoa Kadano. In pratica, si mantiene un NSMutableArray degli oggetti UITouch correnti. Tuttavia la documentazione di UITouch stati questo:

Un UITouch oggetto è persistente tutta una sequenza multi-touch. L'utente non deve mai conservare un oggetto UITouch durante la gestione di un evento. Se è necessario mantenere le informazioni su un tocco da una fase all'altra, è necessario copiare tali informazioni dall'oggetto UITouch .

Non vedo il motivo per non mantenerlo se lo rilasci quando l'evento è terminato ma questo è ciò che dice il documento SDK.

2

stavo cercando le stesse informazioni. E sì, sembra che non si supponga di conservare i dati di UITouch. In base alla sezione "Gestione di una sequenza multi-touch complessa" di questo Apple Developer Documentation, il modo "corretto" per tenere traccia di più tocchi è il valore del puntatore dell'evento UITouch.

Problemi correlati