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?
1
A
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;
}
Sie können den Standort (CGPoint) von UITouch abrufen. –
@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
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. –