Как получить местоположение UITouch из UIGestureRecognizer
Я хочу получить местоположение UITouch моего крана из UIGestureRecognizer, но я не могу понять, как смотреть на документацию и другие вопросы SO. Может ли кто-нибудь из вас вести меня?
- (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];
}
ФИКСИРОВАННЫЙ КОД ЗДЕСЬ - ЭТО ТАКЖЕ ИСПРАВЛЯЕТ НЕИСПРАВНОСТЬ Y AXIS
CGPoint touchLocation = [[CCDirector sharedDirector] convertToGL:[self convertToNodeSpace:[tapRecognizer locationInView:[[CCDirector sharedDirector] openGLView]]]];
Ответы
Ответ 1
Вы можете использовать метод locationInView:
в UIGestureRecognizer. Если вы передадите ноль для представления, этот метод вернет местоположение касания в окне.
- (void)handleTap:(UITapGestureRecognizer *)tapRecognizer
{
CGPoint touchPoint = [tapRecognizer locationInView: _tileMap]
}
Существует также полезный метод делегата gestureRecognizer:shouldReceiveTouch:
. Просто убедитесь, что вы выполнили и установили делегат жесты нажатия на себя.
Сохраните ссылку на распознаватель жестов.
@property UITapGestureRecognizer *theTapRecognizer;
Инициировать распознаватель жестов
_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;
}
Ответ 2
В Swift:
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
print("tap working")
if gestureRecognizer.state == UIGestureRecognizerState.Recognized
{
print(gestureRecognizer.locationInView(gestureRecognizer.view))
}
}
Ответ 3
Попробуйте следующее:
-(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);
}
Это отображает координаты каждого крана в консоли.
Ответ 4
Apple Docs говорят
UIGestureRecognizer
- (NSUInteger)numberOfTouches
Число объектов UITouch в частном массиве, поддерживаемом получателем.
Поэтому вы не должны обращаться к ним.
Используя значение, возвращаемое этим методом в цикле, вы можете запросить местоположение отдельных касаний с помощью метода locationOfTouch:inView:
.