2010-05-18 8 views
6

J'ai un UIView auquel est associé un UIPanGestureRecognizer. Le mouvement fonctionne correctement, sauf que le point de départ n'est pas celui où le panoramique a été démarré, il est généralement désactivé de 5 à 15 pixels à la fois. Cependant, la variance n'est pas constante et semble être liée à la vitesse à laquelle le mouvement de panoramique a lieu.Le point de départ UIPanGestureRecognizer est désactivé

Pour valider que les touches sont correctement envoyées j'ai ajouté une méthode touchesBegan à une sous-vue et elle reçoit le point de départ correct mais le geste ne fournit pas le même point dans sa phase de début. Quelques exemples de mes journaux sont en dessous de 'Point de départ de la ligne' est le premier point reçu de la reconnaissance des gestes.

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 

Quelqu'un at-il vu cette question avant?

Toutes les idées sur la façon de contourner le problème sans avoir à mettre en œuvre une toute nouvelle UIGestureRecognizer?

Répondre

2

Le documentation dit que le geste pan commence lorsque les doigts ont « déplacé assez pour être considéré comme une casserole. » Ce mouvement consiste à distinguer une presse d'une traînée, puisque le doigt de l'utilisateur peut bouger un peu pendant qu'il essaie d'appuyer sans glisser.

Je pense que c'est la différence que vous voyez entre le premier point de contact et le premier point considéré comme faisant partie de la traînée.

+0

Le problème se produit même si vous créez votre propre gestu re Recognizer en étendant UIGestureRecognizer, le point de départ est différent des méthodes touchesBegan. J'ai soumis un bug à Apple. –

+0

Hmm, je ne suis pas sûr de comprendre. Si vous implémentez votre propre UIGestureRecognizer, ne définiriez-vous pas votre propre point de départ dans touchesBegan? – Douglas

+0

@Douglas - Avez-vous déjà trouvé une solution à ce problème? –

0

Pour contourner ce problème, vous pouvez essayer reseting le point de traduction quand commence le geste de reconnaissance. Par exemple, commencez votre méthode d'action sur comme ceci:

- (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

Oui, la différence est parce que le geste de reconnaissance attend une distance indéterminée du mouvement avant de devenir actif. Ce que vous pouvez faire est de créer votre propre UIPanGestureRecognizer et définir l'état à UIGestureRecognizerStateChanged dans la méthode de remplacement touchesMoved.

REMARQUE: je touhcesMoved au lieu de touchesBegan parce que je voulais commencer quand les utilisateurs déplacés et touchez pas instantanément.

Voici quelques exemples de code pour un geste personnalisé de reconnaissance qui fait cela:

#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

A travaillé comme un charme.N'oubliez pas #import au début de la mise en œuvre de la classe si – SarpErdag

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

Mettez ce code dans le cas UIGestureRecognizerStateBegan

6

Vous pouvez détecter la position de contact initiale d'un geste à la méthode du délégué de reconnaissance de geste

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

J'ai eu le problème exact décrit par cette question, et cela m'a aidé à le résoudre de la bonne façon (à mon humble avis). CGPoint startingLocation = [touch locationInView: self]; // fonctionne à l'intérieur de la méthode delegate –

Questions connexes