¿Cómo cancelar una secuencia de eventos UITouch?

votos
20

Tengo una UIImagevista que responde a eventos táctiles. Quiero cancelar la secuencia táctil, es decir, otras llamadas a touchesMoved:, si el toque sale de ciertos límites. ¿Cómo puedo hacer eso?

Sé que touchesMoved:puedo inspeccionar las coordenadas del objeto táctil e ignorarlo, pero lo que no sé es cómo cancelar la secuencia por completo. No veo ningún método documentado en la Referencia del desarrollador de Apple alUIResponder que pueda llamar para cancelar una secuencia táctil.

Publicado el 10/02/2009 a las 19:37
fuente por usuario
En otros idiomas...                            


12 respuestas

votos
6

Esta solución puede ser un poco complicada, pero podría implementar y llamar manualmente

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

Estoy basando esta solución libremente en algunos ajustes que hice a la aplicación de ejemplo MoveMe en el sitio de código de muestra de iPhone de Apple, donde modifiqué el touchesMovedmétodo para que se vea así:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch *touch = [touches anyObject];
     if ([touch view] == placardView)
         CGPoint location = [touch locationInView:self];
         placardView.center = location;
         // I added the following line:
         [self touchesCancelled:touches withEvent:event];
         return;
}
Respondida el 10/02/2009 a las 20:51
fuente por usuario

votos
3

Trate de establecer la propiedad temporal userInteractionEnabled del UIImageView en NO

Respondida el 28/11/2011 a las 04:30
fuente por usuario

votos
3

Es necesario llamar [super touchesMoved:withEvent:]con el fin de permitir que el super vista a limpiar desde el evento pero lo más importante, lo que necesita para no llamar [super touchesCancelled:withEvent:].

Esto es lo que solía en una celda para evitar que se selecciona cuando detecté un golpe:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        if (IS_FAR_ENOUGH_TO_BE_A_SWIPE) {
            RESPOND_TO_SWIPE
            showingEdit = YES;
            [super touchesCancelled:touches withEvent:event];
        } else {
            [super touchesMoved:touches withEvent:event];
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        [super touchesEnded:touches withEvent:event];
    }
}
Respondida el 13/05/2010 a las 01:50
fuente por usuario

votos
2

No creo que sea posible porque yo no lo veo documentado y ninguna de estas soluciones funciona.

Respondida el 21/11/2011 a las 05:23
fuente por usuario

votos
2

He enfrentado el mismo problema hace poco y encontré una forma estándar para resolverlo. Puede utilizar [[UIApplication sharedApplication] beginIgnoringInteractionEvents] para detener la entrega de eventos touchesMoved a toda la aplicación. Asegúrese de que habilitarlos [[UIApplication sharedApplication] endIgnoringInteractionEvents] cuando se necesita para recibir toques de nuevo.

Respondida el 05/04/2010 a las 10:30
fuente por usuario

votos
1

Puedo lograr esto mediante la eliminación de la vista desde su supervista y la adición de él hacia atrás.

[view retain];
UIView *sv = view.superview;
[view removeFromSuperview];
[sv addSubview:view];
[view release];

Esto rompe la cadena de respuesta a la vista, así que no se recibirán ningún toques restantes en la vista. El siguiente toque todavía será recibido de forma normal.

Respondida el 03/08/2016 a las 07:44
fuente por usuario

votos
1

Este código le ayudará. Desactivo eventos táctiles en touchesMoved:método y estoy permitiendo a eventos táctiles en el touchesCancelled:método

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *touch = [touches anyObject];
     .......
     .......
     Your code
     .......
     .......

     //Condition when you want to disable touch event

     [[UIApplication sharedApplication] beginIgnoringInteractionEvents];

     .......
     .......
     Your code
     .......
     .......
 }


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
Respondida el 21/08/2014 a las 11:31
fuente por usuario

votos
1

solución de "fuerza bruta", dependiendo si se adapta a sus necesidades: Retire y vuelva a inicializar la subvista que recibe los toques o responde a ellos (por supuesto cuidar de marco y contenido).

Respondida el 24/03/2013 a las 21:56
fuente por usuario

votos
0

Yo sólo estaba tratando de resolver algo así, y se encontró que ninguna de las soluciones que se indican a ella trabajó para mí. Lo mejor que podía manejar estaba ignorando temporalmente los toques, pero luego se reanudó cuando volvió a entrar en el toque de la vista.

Finalmente resuelto.

  1. Establecer un indicador booleano llamado "desactivado"
  2. En touchedMoved, primero verificar que el contacto está dentro de la vista deseada. Si no es así, establecer el indicador de desactivado a SÍ.
  3. Todavía en en touchedMoved, compruebe el indicador antes de realizar la acción. Por lo tanto, en este punto, no pasará nada si están fuera de la vista.
  4. En touchesEnded, establecer el indicador de desactivado a NO. Por lo que la secuencia de contacto se detiene con eficacia hasta que el usuario levanta su dedo.

Creo que esto va a funcionar para usted a menos que tenga una razón específica por la que necesita, literalmente, la secuencia táctil cancelado.

Respondida el 13/01/2013 a las 15:41
fuente por usuario

votos
0

En IOS5 parece que hay un método privado en UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

Dependiendo de la aplicación de Apple que podría detener el envío de eventos

Otra forma de hacerlo sería utilizar objetos asociativos

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([(NSNumber *)objc_getAssociatedObject(touch, &outKey) boolValue])
        return;
    if (sometouchisoutsideofview) {
        objc_setAssociatedObject(touch, &outKey, [NSNumber numberWithBool:YES], OBJC_ASSOCIATION_RETAIN);
    }
}
Respondida el 25/11/2011 a las 19:44
fuente por usuario

votos
-1

Puede crear la categoría de UITouch. Se puede declarar

@property (nonatomic,strong,readwrite) UIView *view;

Y cuando se cambia touch.view a cero, por ejemplo, se puede simular final de envío de eventos de toque

Respondida el 17/04/2013 a las 20:43
fuente por usuario

votos
-2

Se puede comprobar que, las ubicaciones de los puntos de contacto están en CGRect (es decir. Los puntos están en su rectángulo de imageview) o no. Si no están en esa Rect, se cancelará el toque.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];

    if (CGRectContainsPoint(myImageView, touchLocation))
    {
       lastPoint = [touch locationInView: myImageView];
    }

    NSLog(@"Last :%.2f - %.2f",lastPoint.x, lastPoint.y);   
  }

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
 {
  CGPoint currentPoint;
  UITouch *touch = [touches anyObject];
  CGPoint touchLocation = [touch locationInView:self.view];

     if (CGRectContainsPoint(myImageView.frame, touchLocation))
     {
       currentPoint = [touch locationInView: myImageView];
     }
 }
Respondida el 24/11/2011 a las 06:44
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more