iphone objective-c ios uigesturerecognizer pan

iphone - ¿Cómo capturo el punto inicialmente tocado en un UIPanGestureRecognizer?



objective-c ios (7)

Tengo una aplicación que permite al usuario trazar líneas en la pantalla. Lo estoy haciendo grabando los puntos dentro de un UIPanGestureRecognizer:

-(void)handlePanFrom:(UIPanGestureRecognizer *)recognizer { CGPoint pixelPos = [recognizer locationInView:rootViewController.glView]; NSLog(@"recorded point %f,%f",pixelPos.x,pixelPos.y); }

Eso funciona bien. Sin embargo, estoy muy interesado en el primer punto que el usuario tocó antes de comenzar a filtrar. Pero el código anterior solo me da los puntos que ocurrieron después de que el gesto fuera reconocido como una bandeja (en lugar de un toque).

A partir de la documentación, parece que puede no haber una manera fácil de determinar la ubicación con acceso inicial dentro de la API UIPanGestureRecognizer. Aunque en UIPanGestureRecognizer.h, encontré esta declaración:

CGPoint _firstScreenLocation;

... lo que parece ser privado, así que no hay suerte. Estoy considerando la posibilidad de salir del sistema UIGestureRecognizer solo para capturar ese punto de acceso directo, y luego referirme a él una vez que sepa que el usuario realmente ha comenzado un UIPanGesture. Pensé que pediría aquí, sin embargo, antes de ir por ese camino.


@John Lawrence tiene razón.

Actualizado para Swift 3:

import UIKit.UIGestureRecognizerSubclass class PanRecognizerWithInitialTouch : UIPanGestureRecognizer { var initialTouchLocation: CGPoint! override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { super.touchesBegan(touches, with: event) initialTouchLocation = touches.first!.location(in: view) } }

Tenga en cuenta que la variable de instancia initialTouchLocation no puede ser privada, si desea acceder a ella desde su instancia de subclase (manejador).

Ahora en el controlador,

func handlePan (_ sender: PanRecognizerWithInitialTouch) { let pos = sender.location(in: view) switch (sender.state) { case UIGestureRecognizerState.began: print("Pan Start at /(sender.initialTouchLocation)") case UIGestureRecognizerState.changed: print(" Move to /(pos)")


Debería poder utilizar translationInView: para calcular la ubicación de inicio a menos que lo restablezca en el medio. Obtenga la traducción y la ubicación actual del toque y úsela para encontrar el punto de inicio del toque.



Podrías usar este método:

CGPoint point = [gesture locationInView:self.view];



Tarde en la fiesta, pero me doy cuenta de que nada de lo que está arriba responde a la pregunta, y de hecho hay una manera de hacerlo. Debe subclase UIPanGestureRecognizer e incluir:

#import <UIKit/UIGestureRecognizerSubclass.h>

ya sea en el archivo Objective-C en el que escribe la clase o en su encabezado de puente de Swift. Esto le permitirá anular el método touchesBegan: withEvent de la siguiente manera:

class SomeCoolPanGestureRecognizer: UIPanGestureRecognizer { private var initialTouchLocation: CGPoint! override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) { super.touchesBegan(touches, withEvent: event) initialTouchLocation = touches.first!.locationInView(view) } }

Entonces su propiedad initialTouchLocation contendrá la información que busca. Por supuesto, en mi ejemplo supongo que el primer toque en el conjunto de toques es el de interés, lo cual tiene sentido si tiene un número máximo de toques de 1. Es posible que desee utilizar más sofisticación para encontrar el toque de interés.


Wow, un par de años tarde ... Me encontré con este problema, pero lo resolví con una variable estática:

- (IBAction)handleGesture:(UIPanGestureRecognizer *)recog { CGPoint loc = [recognizer locationInView:self.container]; static CGFloat origin = 0.0f; switch (recognizer.state) { case UIGestureRecognizerStateBegan: origin = loc.x; break; case UIGestureRecognizerStateChanged: case UIGestureRecognizerStatePossible: // origin is still set here to the original touch point! break; case UIGestureRecognizerStateEnded: break; case UIGestureRecognizerStateFailed: case UIGestureRecognizerStateCancelled: break; } }

La variable solo se establece cuando el estado del reconocedor es UIGestureRecognizerBegan. Como la variable es estática, el valor persiste en las llamadas de método posteriores.

Para mi caso, solo necesitaba la coordenada x, pero puede cambiarla a CGPoint si lo necesita.