Search code examples
iosobjective-cxcodecocos2d-iphoneuigesturerecognizer

How to get UITouch location from UIGestureRecognizer


I want to get the UITouch location of my tap from UIGestureRecognizer, but I can not figure out how to from looking at both the documentation and other SO questions. Can one of you guide me?

- (void)handleTap:(UITapGestureRecognizer *)tapRecognizer
{
    CCLOG(@"Single tap");
    UITouch *locationOfTap = tapRecognizer; //This doesn't work

    CGPoint touchLocation = [_tileMap convertTouchToNodeSpace:locationOfTap];
    //convertTouchToNodeSpace requires UITouch

    [_cat moveToward:touchLocation];
}

FIXED CODE HERE - THIS ALSO FIXES INVERTED Y AXIS

CGPoint touchLocation = [[CCDirector sharedDirector] convertToGL:[self convertToNodeSpace:[tapRecognizer locationInView:[[CCDirector sharedDirector] openGLView]]]];

Solution

  • You can use the locationInView: method on UIGestureRecognizer. If you pass nil for the view, this method will return the location of the touch in the window.

    - (void)handleTap:(UITapGestureRecognizer *)tapRecognizer
    {
        CGPoint touchPoint = [tapRecognizer locationInView: _tileMap]
    }
    

    There is also a helpful delegate method gestureRecognizer:shouldReceiveTouch:. Just make sure to implement and set your tap gesture's delegate to self.

    Keep a reference to the gesture recognizer.

    @property UITapGestureRecognizer *theTapRecognizer;
    

    Initiailze the gesture recognizer

    _theTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(someMethod:)];
    _theTapRecognizer.delegate = self;
    [someView addGestureRecognizer: _theTapRecognizer];
    

    Listen for delegate methods.

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        CGPoint touchLocation = [_tileMap convertTouchToNodeSpace: touch];
        // use your CGPoint
        return YES;
    }