2011-09-20 13 views
11

Mi vista tiene un UIPanGestureRecognizer agregado a ella.
El problema es que para cuando el toque se reconoce como un gesto de desplazamiento, tiene que moverse unos pocos puntos, y no puedo extraer la ubicación táctil original en el estado UIGestureRecognizerStateBegan. En este estado, translationInView: es (0,0) y cualquier movimiento posterior se calcula a partir de este punto y no desde el original.Obtener ubicación de contacto original de UIPanGestureRecognizer

¿Hay alguna forma de extraer la ubicación original del reconocedor de gestos en sí, o debo anular el método touchesBegan:?

+0

Este enlace puede ayudar - http://www.icodeblog.com/2010/10/14/working-with-uigesturerecognizers/ – Coffee

Respuesta

7

Usted debe ser capaz de establecer el delegate para el reconocedor gesto e implementar

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

para obtener el contacto inicial.

+2

Esto funciona, también. Sin embargo, al final usé 'touchesBegan:'. Parece que el reconocedor de gestos pan no tiene ni idea de dónde comenzó originalmente el evento táctil. – antalkerekes

1

Si utiliza locationInView: en lugar de translationInView: obtendrá coordenadas absolutas en lugar de coordenadas relativas. Sin embargo, usted tiene que comenzar la bandeja de entrada para obtener ... Para solucionar este su punto de vista puede ser un UIButton y puede desencadenar una - (IBAction)buttonWasTouched:(UIButton *)button forEvent:(UIEvent *)event conectado a "touch down" así:

-(IBAction)shakeIntensityPanGesturebuttonWasTouched:(UIButton *)button forEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; //touch location local cordinates 
} 
3

Puede resolver este problema mediante la implementación un PanGestureRecognizer personalizado que guarda el punto de contacto original y lo pone a disposición de la persona que llama.

Fui por esta ruta porque también quería controlar la distancia movida para disparar un pan gesto.

Esto podría ser excesivo para su situación, pero funciona perfectamente y es menos difícil de lo que parece.

Para obtener las coordenadas touchpoint, que acaba de llamar:

[sender touchPointInView:yourView] 

en lugar de:

[sender locationInView:yourView] 

Aquí está el código para PanGestureRecognizer.m:

#import "PanGestureRecognizer.h" 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@implementation PanGestureRecognizer 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    UITouch *touch = [touches anyObject]; 

    // touchPoint is defined as: @property (assign,nonatomic) CGPoint touchPoint; 

    self.touchPoint = [touch locationInView:nil]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint p = [touch locationInView:nil]; 

    // customize the pan distance threshold 

    CGFloat dx = fabs(p.x-self.touchPoint.x); 
    CGFloat dy = fabs(p.y-self.touchPoint.y); 

    if (dx > 2 || dy > 2) { 
     if (self.state == UIGestureRecognizerStatePossible) { 
      [self setState:UIGestureRecognizerStateBegan]; 
     } 
     else { 
      [self setState:UIGestureRecognizerStateChanged]; 
     } 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 

    if (self.state == UIGestureRecognizerStateChanged) { 
     [self setState:UIGestureRecognizerStateEnded]; 
    } 
    else { 
     [self setState:UIGestureRecognizerStateCancelled]; 
    } 
} 

- (void) reset 
{ 
} 

// this returns the original touch point 

- (CGPoint) touchPointInView:(UIView *)view 
{ 
    CGPoint p = [view convertPoint:self.touchPoint fromView:nil]; 

    return p; 
} 

@end 
+0

No entiendo cómo se debe usar esto. –

0

Puede utilizar el UIGestureRecognizerState

- (void) onPanGesture:(UIPanGestureRecognizer *)sender { 
    if(sender.state == UIGestureRecognizerStateBegan) { 
     origin = [sender locationInView]; 
    } else { 
     current = [sender locationInView]; 
     // Initial touch stored in origin 
    } 
} 

Swift (más o menos):

var state = recognizer.state 
if state == UIGestureRecognizerState.Began { 
    println(recognizer.locationInView(viewForGesture)) 
    //this will be the point of first touch 
} 
+0

proporcione algún tipo de explicación para su respuesta. – Lal

+0

Los reconocedores de gestos tienen diferentes estados (.Bean, .Ended, .Cancelado, etc.). Si obtiene la ubicación de (ver o tocar) cuando el estado del reconocedor es. Comenzó, tendrá su primera ubicación. – Aiden

+0

Coloque este código dentro de la función a la que llama el gesto.La línea println de arriba solo imprimirá un par de coordenadas por toque/panorámica – Aiden

Cuestiones relacionadas