iphonegesture-recognition

How to implement one-finger rotate gesture recognizer?


I'm aware that there's the UIRotateGestureRecognizer already part of the iOS. But this gesture required two fingers. How I can implement a similar gesture recognizer requiring only one finger? There's a game in the AppStore - Gyrotate with a pretty good implementation of this. Any clues are appreciated. Thx.


Solution

  • Here's the code - it works on my simulator. Mark answered if that is what you were looking for.

        // On new touch, start a new array of points
    - (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event
    {
        self.points = [NSMutableArray array];
        CGPoint pt = [[touches anyObject] locationInView:self];
        [self.points addObject:[NSValue valueWithCGPoint:pt]];
    }
    
    // Add each point to the array
    - (void) touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event
    {
        CGPoint pt = [[touches anyObject] locationInView:self];
        [self.points addObject:[NSValue valueWithCGPoint:pt]];
        [self setNeedsDisplay];
    }
    
    // At the end of touches, determine whether a circle was drawn
    - (void) touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event
    {
        if (!self.points) return;
        if (self.points.count < 3) return;
    
        // Test 1: The start and end points must be between 60 pixels of each other
        CGRect tcircle;
        if (distance(POINT(0), POINT(self.points.count - 1)) < 60.0f)
            tcircle = [self centeredRectangle];
    
        // Test 2: Count the distance traveled in degrees. Must fall within 45 degrees of 2 PI
        CGPoint center = CGPointMake(CGRectGetMidX(tcircle), CGRectGetMidY(tcircle));
        float distance = ABS(acos(dotproduct(centerPoint(POINT(0), center), centerPoint(POINT(1), center))));
        for (int i = 1; i < (self.points.count - 1); i++)
            distance += ABS(acos(dotproduct(centerPoint(POINT(i), center), centerPoint(POINT(i+1), center))));
        if ((ABS(distance - 2 * M_PI) < (M_PI / 4.0f))) circle = tcircle;
    
        [self setNeedsDisplay];
    }