Obtenga una location táctil original de UIPanGestureRecognizer

Mi vista tiene agregado un UIPanGestureRecognizer .
El problema es que para cuando el toque se reconozca como un gesto de paneo, tiene que moverse unos pocos puntos, y no puedo extraer la location 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 del original.

¿Hay alguna manera de extraer la location original del reconocimiento de touchesBegan: sí mismo, o tengo que anular el método touchesBegan: 😕

Debería poder configurar el delegate para el reconocimiento y el implemento de gestos.

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

para get el toque inicial.

Puede resolver este problema implementando un PanGestureRecognizer personalizado que guarda el punto de contacto original y lo pone a disposition de quien llama.

Fui a esta ruta porque también quería controlar la distancia recorrida para activar un gesto de paneo .

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

Para get las coorderadas del punto de contacto, simplemente llama:

 [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(px-self.touchPoint.x); CGFloat dy = fabs(py-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 

Si usa locationInView: lugar de translationInView: obtendrá coorderadas absolutas en lugar de coorderadas relativas. Sin embargo, tiene que iniciar la bandeja para get input … Para evitar esto, su vista puede ser un button UIB y puede activar un - (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 } 

Puede usar UIGestureRecognizerState

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

Swift (ish):

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