2010-05-18 10 views
6

Ich habe eine UIView, die einen UIPanGestureRecognizer hat daran angefügt die Geste funktioniert gut, außer dass der Startpunkt ist nicht, wo die Pfanne zuerst gestartet ist es in der Regel um 5 bis 15 Pixel in der x und y-Koordinaten. Leider ist die Varianz nicht konsistent und scheint mit der Geschwindigkeit zu korrelieren, mit der die Panning-Bewegung stattfindet.UIPanGestureRecognizer Startpunkt ist aus

Um zu bestätigen, dass die Berührungen korrekt gesendet werden, habe ich eine touchsBegan-Methode zu einer Unteransicht hinzugefügt und erhält den richtigen Startpunkt, aber die Geste bietet nicht den gleichen Punkt in seiner Anfangsphase. Einige Beispiele aus meinen Logs befinden sich unter "Startpunkt der Linie" ist der erste Punkt, der vom Gestenerkenner empfangen wird.

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 

Hat jemand dieses Problem schon einmal gesehen?

Haben Sie Ideen, wie Sie das Problem umgehen können, ohne einen völlig neuen UIGestureRecognizer implementieren zu müssen?

Antwort

2

Die documentation sagt, dass die Schwenkgeste beginnt, wenn die Finger "genug bewegt worden sind, um als Pfanne betrachtet zu werden". Diese Bewegung dient dazu, einen Druck von einem Ziehen zu unterscheiden, da der Finger des Benutzers sich ein wenig bewegen kann, während er versucht, ohne zu ziehen zu drücken.

Ich denke, das ist der Unterschied, den Sie zwischen dem ersten Berührungspunkt und dem ersten Punkt als Teil des Ziehens sehen.

+0

Das Problem tritt auch auf, wenn Sie Ihre eigene Gestu erstellen Re Recognizer durch Erweiterung UIGestureRecognizer, der Startpunkt ist anders als die touchesBegan-Methoden. Ich habe Apple einen Fehler gemeldet. –

+0

Hmm, ich bin mir nicht sicher, ob ich das verstehe. Wenn Sie Ihren eigenen UIGestureRecognizer implementieren, würden Sie Ihren eigenen Startpunkt in touchesBegan sowieso nicht definieren? – Douglas

+0

@Douglas - Haben Sie jemals eine Lösung gefunden? –

0

Um dies zu umgehen, können Sie versuchen, den Übersetzungspunkt zurückzusetzen, wenn die Gestenerkennung beginnt. Zum Beispiel, starten Sie Ihre Aktion-Methode aus, wie so:

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

Ja der Unterschied ist, weil die Gestenerkenner einen unbestimmten Abstand der Bewegung wartet, bevor er aktiv wird. Sie können Ihren eigenen UIPanGestureRecognizer erstellen und den Status in der Methode toysMoved override auf UIGestureRecognizerStateChanged setzen.

HINWEIS: Ich habe touhcesMoved statt touchesBegan verwendet, weil ich wollte, dass es startet, wenn die Benutzer berührt und nicht sofort bewegt.

Hier einige Beispiel-Code für einen Erkenner benutzerdefinierte Geste, das dies tut:

#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

Arbeitete wie ein Zauber.Vergessen Sie nicht zu Beginn der Klassenimplementierung #import obwohl – SarpErdag

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

diesen Code im Fall UIGestureRecognizerStateBegan Put

6

Sie mit der Anfangsberührungsposition einer Geste erkennen kann Gestenerkenner-Delegiertenmethode

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

Ich hatte das genaue Problem, das durch diese Frage beschrieben wird, und dies half mir, es richtig zu lösen (IMHO). CGPoint startingLocation = [Touch locationInView: self]; // Arbeitet innerhalb der Delegiertenmethode –