2010-05-18 10 views
6

Tengo una UIView que tiene un UIPanGestureRecognizer adjunto, el gesto funciona bien, excepto que el punto de inicio no es donde comenzó la panorámica por lo general está fuera de 5 a 15 píxeles tanto en la x como y coordenadas.Lamentablemente, la varianza no es consistente y parece estar relacionada con la velocidad a la que tiene lugar el movimiento de panoramización.El punto de inicio de UIPanGestureRecognizer está desactivado

Para validar que los toques se envían correctamente, he agregado un método touchesBegan a una subvista y recibe el punto de inicio correcto, pero el gesto no proporciona el mismo punto en su fase de inicio. Algunos ejemplos de mis registros están debajo del 'Punto de inicio de línea' es el primer punto recibido del reconocedor de gestos.

touchesBegan got point 617.000000x505.000000 
Line start point at 630.000000x504.0000001 
touchesBegan got point 403.000000x503.000000 
Line start point at 413.000000x504.000000 
touchesBegan got point 323.000000x562.000000 
Line start point at 341.000000x568.000000 

Alguien ha visto este problema antes?

¿Alguna idea sobre cómo solucionar el problema sin tener que implementar un UIGestureRecognizer completamente nuevo?

Respuesta

2

documentation dice que el gesto de desplazamiento comienza cuando los dedos se "movieron lo suficiente para que se lo considere una bandeja". Este movimiento es para distinguir una prensa de una resistencia, ya que el dedo del usuario puede moverse un poco mientras intenta presionar sin arrastrar.

Creo que esta es la diferencia que está viendo entre el primer punto de contacto y el primer punto considerado parte del arrastre.

+0

El problema se produce incluso si crea su propio gestu Reconocedor extendiendo UIGestureRecognizer, el punto de partida es diferente de los métodos touchesBegan. Envié un error a Apple. –

+0

Hmm, no estoy seguro de entender. Si está implementando su propio UIGestureRecognizer, ¿no definiría su propio punto de partida en touchesBegan de todos modos? – Douglas

+0

@Douglas - ¿Alguna vez has encontrado una solución a esto? –

0

Para evitar esto, podría intentar restablecer el punto de traducción cuando comience el reconocedor de gestos. Por ejemplo, inicie su método de acción a cabo de esta manera:

- (void)panGesture:(UIPanGestureRecognizer *)recognizer; 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     CGPoint point = ...; // The view's initial origin. 
     UIView *superview = [recognizer.view superview]; 
     [recognizer setTranslation:point inView:superview]; 
    } 
} 
2

Si la diferencia se debe a que el reconocedor gesto espera una distancia indeterminada de movimiento antes de convertirse en activa. Lo que puede hacer es crear su propio UIPanGestureRecognizer y establecer el estado en UIGestureRecognizerStateChanged en el método de anulación touchesMoved.

NOTA: utilicé touhcesMoved en lugar de touchesBegan porque quería que se iniciara cuando los usuarios tocaran movidos y no al instante.

Aquí hay un código de ejemplo para un reconocedor gesto a medida que hace esto:

#import "RAUIPanGestureRecognizer.h" 

@implementation RAUIPanGestureRecognizer 


#pragma mark - UIGestureRecognizerSubclass Methods 

- (void)reset 
    { [super reset ]; } 

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

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     [self setState:UIGestureRecognizerStateChanged ]; 
     [super touchesMoved:touches withEvent:event ]; 
    } 

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

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


@end 
+0

Funcionó como un amuleto.No se olvide de Importar en el comienzo de la implementación de la clase a través de – SarpErdag

3
CGPoint beg = [panRecognizer locationInView:_scrollView]; 
    CGPoint trans = [panRecognizer translationInView:_scrollView]; 
    CGPoint firstTouch = CGPointSubtract(beg, trans); 

Pon este código en el caso UIGestureRecognizerStateBegan

6

Usted puede detectar la posición de contacto inicial de un gesto con la método delegado del reconocedor de gestos

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

Tuve el problema exacto descrito por esta pregunta, y esto me ayudó a resolverlo de la manera correcta (en mi humilde opinión). CGPoint startingLocation = [touch locationInView: self]; // funciona dentro del método de delegado –

Cuestiones relacionadas