ios - Retraso de TouchesBegan en el lado izquierdo de la pantalla
objective-c iphone (1)
Lo he experimentado como usuario y es realmente molesto. Lo único que funcionó para mí fue desactivar el toque 3D. De lo contrario, el lado izquierdo de la pantalla táctil es casi inútil.
En el iPhone con el toque 3D habilitado, hay una función donde presionar prolongadamente el lado izquierdo de la pantalla con la fuerza suficiente para abrir le permite cambiar qué aplicación está activa. Debido a esto, cuando ocurre un toque sin movimiento en el lado izquierdo de la pantalla, el evento táctil se retrasa por uno o dos segundos hasta que el iPhone verifica que el usuario no está tratando de cambiar tareas y está interactuando con la aplicación.
Este es un problema importante al desarrollar un juego con SpriteKit, ya que estos toques se retrasan por un segundo cada vez que un usuario toca / sostiene su dedo en el borde izquierdo de la pantalla. Pude resolver este problema registrando un UILongPressGestureRecognizer
en la escena principal del juego, deshabilitando así TouchesBegan
e implementando una función de toques personalizados (utilizada como selector por el reconocedor de gestos):
-(void)handleLongPressGesture:(UITapGestureRecognizer *)gesture {
CGPoint location = [gesture locationInView:self.view];
if (gesture.state == UIGestureRecognizerStateBegan)
{
//
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
//
}
else if (gesture.state == UIGestureRecognizerStateEnded)
{
//
}
else if (gesture.state == UIGestureRecognizerStateCancelled)
{
//
}
}
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)];
longPressGestureRecognizer.delaysTouchesBegan = false;
longPressGestureRecognizer.minimumPressDuration = 0;
[view addGestureRecognizer:longPressGestureRecognizer];
// continue
}
El problema con esto es que tendré que implementar un reconocedor de gestos para cada toque (incluidos los simultáneos) que espero que ingrese el usuario. Esto interfiere con cualquier método touchesBegan
como subclases de SKSpriteNode
, SKScene
, etc. y elimina una gran cantidad de funcionalidades.
¿Hay alguna forma de desactivar este retraso? Al registrar el gestureRecognizer, pude establecer la propiedad delaysTouchesBegan
en falso. ¿Puedo hacer lo mismo de alguna manera para mi SKScene?
Para ver este problema en acción, puede ejecutar el proyecto SpriteKit predeterminado y tocar (mantener durante uno o dos segundos) cerca del lado izquierdo de la pantalla. Verá que hay una demora entre cuando toca la pantalla y cuando se renderizan los SKShapeNodes
(en lugar de tocar en cualquier otro lugar de la pantalla).
* Editar 1 * Para aquellos que tratan de encontrar una forma de evitar esto por el momento, puede mantener el reconocedor de gestos pero establecer su cancelsTouchesInView
en falso. Utilice el reconocedor de gestos para hacer todo lo que necesite hasta que toque touchesBegan
( touchesBegan
recibirá el mismo evento táctil un segundo después de que el reconocedor de gestos reconozca el toque). Una vez que inicie touchesBegan
, puede desactivar todo lo que sucede en el reconocedor de gestos. Esto parece una solución descuidada para mí, pero funciona por ahora.
Todavía estoy tratando de encontrar una solución más o menos formal.