3

У меня есть два распознавателя жестов, которые распознают правильный жест и длинный жест прессы. Я попытался использовать метод делегата gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, но всякий раз, когда я выполняю салфетки и длинные жесты, метод вызывается много раз, а не один раз. Я использую следующий код для настройки распознавателей жестов, вызова метода делегата и обработки жестов после их выполнения.Как реализовать распознаватель жестов и удерживания жестов?

//Setting up the swipe gesture recognizer 
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeRight:)]; 
swipeRight.direction = UISwipeGestureRecognizerDirectionRight; 
swipeRight.delegate = self; 
[self addGestureRecognizer:swipeRight]; 

//Setting up the long press gesture recognizer 
UILongPressGestureRecognizer *rightLongPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeRight:)]; 
rightLongPressRecognizer.delegate = self; 
rightLongPressRecognizer.tag = PRESS_RIGHT_TAG; 
[rightLongPressRecognizer setMinimumPressDuration:0.5]; 
[self addGestureRecognizer:rightLongPressRecognizer]; 

//Delegate method 
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

//Method that the gestures call 
-(void)handleSwipeRight: (UIGestureRecognizer *)recognizer { 

    self.player.direction = RIGHT; 
    [self resetSpriteView]; 
    [self.playerSprite startAnimating]; 

    float playerSpriteX = self.playerSprite.center.x; 
    float playerSpriteY = self.playerSprite.center.y; 
    self.toPoint = CGPointMake(playerSpriteX + TILE_WIDTH, playerSpriteY); 
    if(!([self checkIfPlayerHasReachedEnd])) { 
     self.fromPoint = CGPointMake(playerSpriteX, playerSpriteY); 
     CABasicAnimation *moveAnimation = [CABasicAnimation animation]; 
     moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(playerSpriteX + TILE_WIDTH, playerSpriteY)]; 
     [moveAnimation setDelegate:self]; 
     [moveAnimation setFillMode:kCAFillModeForwards]; 
     [moveAnimation setRemovedOnCompletion:NO]; 
     [moveAnimation setDuration:MOVE_ANIMATION_DURATION]; 
     [self.playerSprite.layer addAnimation:moveAnimation forKey:@"position"]; 
    } 
} 

Есть ли лучший способ реализовать салфетки и держать жест распознаватель?

+2

Хороший вопрос, +1. –

+0

Почему вы используете тот же метод для обработки обоих жестов? Это нормально, если вам это становится сложнее. – Peres

+0

@JackyBoy - Ну, я думал, что мне нужно установить способ распознавания жестов, поэтому я не был уверен, что еще делать. Есть ли лучший способ сделать это? – pasawaya

ответ

2

Я думаю, что здесь проблема заключается в неправильной концепции того, что делает делегат, и то, что метод вызывается, когда этот жест выполняется, на самом деле - ничто иное.

Ручка долгое нажатие в другой метод:

UILongPressGestureRecognizer *rightLongPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 

и обрабатывать салфетки жест в его собственном:

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeRight:)]; 
+0

Можете ли вы немного рассказать об этом? Что я могу сделать с моим кодом, чтобы исправить мою «неправильную концепцию» того, что делает делегат? Во всяком случае, я ценю ответ! – pasawaya

+0

Check my edit ... – Peres

+0

Спасибо за редактирование, но что будет сделано в 'handleLongPress:' и 'handleSwipeRight? Будет ли у них такая же реализация? – pasawaya

Смежные вопросы