2016-06-10 19 views
1

Ich habe Alphabet A mit UIBezierPath gezeichnet. Es gibt drei Richtungen, die zeigen, wie der Benutzer dieses Alphabet zeichnet. Gibt es eine Möglichkeit zu überprüfen, ob die Bewegung des Benutzers in die gleiche Richtung verläuft oder nicht?Benutzer Touch-Bewegungsrichtung erkennen?

enter image description here

+0

Sie können den Standort (CGPoint) von UITouch abrufen. –

+0

@SaurabhPrajapati Ja, ich kann das, aber ich möchte wissen, wie man die Bewegung des Benutzers in der gleichen Richtung überprüft oder nicht? – saadnib

+0

behalten Sie alle Richtungen als Datenbank. Erstellen Sie eine Schwellenwertdistanz (20-30 Pixel), halten Sie den "touchBegan" -Punkt am Leben. Errechne auf jedem "touchesMoved" Abstand und Winkel (Startpunkt und aktueller Punkt). vergleichen und entscheiden. –

Antwort

1

Ich empfehle eine UIPanGestureRecognizer. Es gibt Ihnen die aktuelle Position, die Übersetzung vom Startpunkt und die aktuelle Geschwindigkeit. Wenn Sie die Geschwindigkeit verfolgen, wissen Sie, ob sie mit der vorherigen Geschwindigkeit übereinstimmt.

Sie -[UIBezierPath containsPoint:] verwenden können, um festzustellen, ob die Geste

Wie so noch innerhalb der A. ist:

- (void)panRecognizerFired:(UIPanGestureRecognizer *)panRecognizer { 
    switch (panRecognizer.state) { 
     case UIGestureRecognizerStatePossible: 
     { 
      // ignore it until it changes to UIGestureRecognizerStateBegan 
      return; 
     } 
     case UIGestureRecognizerStateBegan: 
     { 
      // handle gesture start here 

      // change this to a break if you want a beginning touch to be processed 
      // the same as a movement 
      return; 
     } 
     case UIGestureRecognizerStateEnded: 
     { 
      // handle gesture end here - clean up and undo whatever happened 
      // in UIGestureRecognizerStateBegan, show a new controller or something, etc 

      // change this to a break if you want an ending touch to be processed 
      // the same as a movement 
      return; 
     } 
     case UIGestureRecognizerStateFailed: 
     case UIGestureRecognizerStateCancelled: 
     { 
      // abort! undo everything here 
      return; 
     } 
     default: 
      // it moved! break to process that movement 
      break; 
    } 

    CGPoint location = [panRecognizer locationInView:self.theViewThatHasTheLetterAInIt]; 
    CGPoint translation = [panRecognizer translationInView:self.theViewThatHasTheLetterAInIt]; 
    CGPoint velocity = [panRecognizer velocityInView:self.theViewThatHasTheLetterAInIt]; 

    BOOL isLocationInsidePath = [self.letterABezierPath containsPoint:location]; 

    // make decisions based on isLocationInsidePath and velocity here... 
} 

Um diese Geste sicherzustellen, dass nur in der Nähe der richtigen Nummer zu beginnen erlaubt ist, sich selbst machen entsprechen dem UIGestureRecognizerDelegate Protokoll und setzen self.panGestureRecognizer.delegate = self. Dann können Sie die Startpositionen folgendermaßen einschränken:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer == self.panGestureRecognizer) { 
     CGPoint location = [gestureRecognizer locationInView:self.theViewThatHasTheLetterAInIt]; 

     // implement this property to return the center of the 1, 2, or 3 circle 
     CGPoint targetCenter = self.currentTargetCenter; 

     CGFloat distanceX = location.x - targetCenter.x; 
     CGFloat distanceY = location.y - targetCenter.y; 
     CGFloat distanceDiagonalSquared = (distanceX * distanceX) + (distanceY * distanceY); 

     const CGFloat maxDistance = 20.f; 

     return (distanceDiagonalSquared <= maxDistance * maxDistance); 
    } 

    return YES; 
}