2013-05-17 2 views
34

Я хочу получить местоположение UITouch моего крана из UIGestureRecognizer, но я не могу понять, как смотреть на документацию и другие вопросы SO. Может ли кто-нибудь из вас вести меня?Как получить местоположение UITouch из UIGestureRecognizer

- (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 КОД ЗДЕСЬ - ЭТО ТАКЖЕ ИСПРАВЛЕНИЯ INVERTED Y AXIS

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

ответ

68

Вы можете использовать метод locationInView: на UIGestureRecognizer. Если вы передадите ноль для представления, этот метод вернет местоположение касания в окне.

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

Существует также полезный метод делегата gestureRecognizer:shouldReceiveTouch:. Просто убедитесь, что вы выполнили и настроили делегата вашего жеребца.

Держите ссылку на распознаватель жестов.

@property UITapGestureRecognizer *theTapRecognizer; 

Initiailze Жест распознаватель

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

Прислушайтесь методов делегата.

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

Мне нужен UITouch для моего 'CGPoint touchLocation = [_tileMap convertTouchToNodeSpace: locationOfTap];' Где convertTouchToNodeSpace преобразует UITouch .. Может этот код можно использовать таким образом? –

+0

Не могли бы вы просто изменить метод convertTouchToNodeSpace: ', чтобы взять CGPoint? – MJN

+0

Я не могу определить, где его определить, команда hahaha –

1

Попробуйте это:

-(void) didMoveToView:(SKView *)view{ 
    oneFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneTapDetected:)]; 
    oneFingerTap.numberOfTapsRequired=1; 
    oneFingerTap.numberOfTouchesRequired=1; 

    [view addGestureRecognizer:oneFingerTap]; 
} 

-(void)oneTapDetected:(UITapGestureRecognizer *)recognizer{ 
    NSLog(@"one tap detec"); 
    tapPositionOneFingerTap = [oneFingerTap locationInView:self.view]; 
    NSLog(@"%f, %f",tapPositionOneFingerTap.x,tapPositionOneFingerTap.y); 
} 

Это выводит координаты каждого крана в консоли.

0

Apple Docs говорит

UIGestureRecognizer

- (NSUInteger)numberOfTouches 

Количество объектов UITouch в частного массива поддерживается приемником.

Поэтому вы не должны иметь к ним доступ.

Используя значение, возвращаемое этим методом в цикле, вы можете запросить местоположение отдельных касаний с помощью метода locationOfTouch:inView:.

10

В Swift:

func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) { 
    print("tap working") 
    if gestureRecognizer.state == UIGestureRecognizerState.Recognized 
    { 
     print(gestureRecognizer.locationInView(gestureRecognizer.view)) 
    } 
}