2010-04-28 18 views
8

Si levanto mi dedo desde el primer toque, reconocerá el siguiente toque muy bien. Es solo cuando sostengo mi primer toque continuamente y luego trato de tocar un área diferente con un dedo diferente al mismo tiempo. A continuación, registrará incorrectamente ese segundo toque como desde el primer toque nuevamente.toques ¿No fue llamado? o al azar se llama

Actualización Tiene algo que ver con los toques. No se ha llamado hasta que el ÚLTIMO toque haya terminado (no importa si ya has terminado otros 5 toques antes de soltar el último ... se les llama a todos a terminar una vez que termina el último toque)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch* touch = [touches anyObject]; 

NSString* filename = [listOfStuff objectAtIndex:[touch view].tag]; 

// do something with the filename now 

} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

ITouch* touch = [touches anyObject]; 
NSString* buttonPressed = [listOfStuff objectAtIndex:[touch view].tag]; 

// do something with this info now 
} 
+1

Creé un proyecto de prueba simple y parece que touchesEnded se llama cada vez que se levanta un dedo ... – Vladimir

+0

Vladimir, ¿te importaría publicar el ejemplo del código en alguna parte para que pueda ver lo que difiere? Por alguna razón, todos mis toques encendidos son llamados más tarde al mismo tiempo en lugar de cuando realmente suceden – iwasrobbed

+0

Por cierto, en mi programa los toques están en UIImageViews que están dentro de una vista de desplazamiento y todo eso está dentro de una UIView si eso hace alguna diferencia – iwasrobbed

Respuesta

7

Por alguna razón, toques Ended se está demorando solo cuando el toque está dentro de la vista de desplazamiento. Si a) desactiva la vista de desplazamiento para desplazarse; o b) no use una vista de desplazamiento, luego toquesEnded se entrega de inmediato.

He oído que algunas personas han interceptado sendEvent, pero eso me parece superficial y realmente no quiero arruinar la cadena de respuesta ya que sendEvent maneja muchos eventos.

¿Alguna idea adicional? ¿Alguna vez alguien ha subclasificado UIWindow para tratar de interceptar los toques de esa manera? Cualquier comentario que pueda proporcionar es apreciado.

0

Conjunto multipleTouchEnabled.

En Interface Builder, es la casilla de verificación "Toque múltiple" en "Interacción del usuario habilitada".

+0

tewha, puede estar en el camino correcto aquí ... Estoy creando UIImageViews en el código y configurando MultipleTouchEnabled durante esa configuración. Por alguna razón, no estoy seguro de que se esté configurando correctamente.He leído en otro lugar que si MultipleTouchEnabled no está configurado en SÍ, entonces touchesEnded no se llamará hasta que el último toque haya terminado (¡lo cual coincide exactamente con mi error!). – iwasrobbed

+0

No importa, simplemente comprobé que todos estaban habilitados y seguro que multipleTouchEnabled es SÍ para todos :( ¿Podría tener algo que ver con todos los UIImageViews dentro de una vista de desplazamiento? Fuera de la vista de desplazamiento, funcionan bien, pero dentro de la vista de desplazamiento no Envía el mensaje de inmediato. – iwasrobbed

6

La vista de desplazamiento tiene una propiedad delaysContentTouches que se establece en YES de forma predeterminada. Retrasará todos los eventos táctiles hasta que determine un gesto de desplazamiento.

4

Sé que esta pregunta es un poco antigua, pero pensé que compartiría mi experiencia con cualquiera que tropiece con este hilo buscando una respuesta, como la que acabo de recibir.

He estado luchando con este problema durante unas horas y la única solución que se me ocurrió fue eliminar cualquier UIGestureRecognizer objetos que estaba usando.

Para mi configuración, yo estaba usando reconocedores de panorámica y de toque para capturar esos gestos, y usando toques Bean y toques para cualquier evento táctil estándar. No fue hasta que eliminé los objetos UIGestureRecognizer que el método touchesEnded comenzó a llamar nuevamente para la segunda terminación táctil. Específicamente, era el reconocedor de panoramización lo que causaba los problemas.

No estoy del todo seguro de si esto se aplica en este caso, pero resolvió los problemas que estaba teniendo.

9

Tuve esto hoy (¡o más bien hoy tuve este problema!).

Lo que vi sucediendo: Pantalla

  • táctil con el dedo 1
  • incendios touchesBegan
  • pantalla táctil con el dedo 2
  • incendios touchesBegan
  • dedo Release 2
  • no pasa nada
  • dedo 1
  • lanzamiento touchesEnded incendios
  • touchesEnded incendios

Como dijo Gavin Clifton, que sólo ocurre si se agrega un reconocedor gesto. Sin un reconocedor agregado, toques Incendios encendidos después de que se libera cada dedo. ¡Lo cual sería genial si no tuviera que usar reconocedores ...!

Resolví esto agregando gestureRotation.delaysTouchesEnded = FALSE; a mi creación reconocedor/código de la adición:

gestureRotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRotation_Callback:)]; 

[gestureRotation setDelegate:self]; 
gestureRotation.cancelsTouchesInView = FALSE; 
gestureRotation.delaysTouchesEnded = FALSE;  // <---- this line!! 
[self.view addGestureRecognizer: gestureRotation]; 
[gestureRotation release]; 

Ahora los gestos funciona, y ya no touchesBegan colas!

0

Acabo de tener este problema, donde un touchesEnded nunca se llamaría en un botón dentro de un ScrollView. En base a la respuesta de Ovidiu, descubrí que la configuración manual de ContentOffset de mi ScrollView estaba causando el problema. Presumiblemente, tener el contentOffset configurado de la manera en que lo tenía era confundir el ScrollView en cuanto a si estaba tratando de presionar el botón o desplazar la vista.

Al dejar que el desplazamiento permanezca en 0,0, el problema desapareció.

0

Encontré otra opción.

Después de touchesBegan y CGPoint no movido según touchesMoved, touchesCancelled llamado.

Sin embargo, si CGPoint ha cambiado de acuerdo con touchesMoved, touchesEnded llamado.