жесты смахивания и панорамирования перекрываются

можно ли позволить определенному жесту не работать, чтобы распознавался следующий возможный жест?

чтобы быть более конкретным, посмотрите на образец фрагмента:

UISwipeGestureRecognizer *swipeLeft = [initialize UISwipeGestureRecognizer... @selector(handleSwipe:)]

swipeLeft = UISwipeGestureRecognizerDirectionLeft;

swipeLeft.delegate = self;

UIPanGestureRecognizer *pan = [initialize UIPanGestureRecognizer... @selector(handlePan:)]

pan.delegate = self;

[pan requireGestureRecognizerToFail:swipeLeft];

приведенный выше код указывает, что если устройство не распознает смахивание влево, будет использоваться обработчик жестов панорамирования.

поэтому мой вопрос: возможно ли, чтобы swipeLeft преднамеренно терпел неудачу (после того, как устройство распознало его как касание влево) на основе некоторых критериев, которые проверяются на handleSwipe, и вместо этого позволять жесту панорамирования обрабатывать сенсорный ввод?

Благодарю.


person rgb    schedule 28.08.2013    source источник


Ответы (2)


Ознакомьтесь с протоколом UIGestureRecognizerDelegate здесь:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIGestureRecognizerDelegate_Protocol/Reference/Reference.html

В частности,

gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

метод может быть полезен. Если вы просто вернете YES из этого метода, оба жеста могут быть распознаны одновременно, поэтому вы сможете правильно реагировать на оба.

person Eric    schedule 28.08.2013
comment
распознавание одновременных жестов не дает мне желаемого поведения, к которому я стремлюсь. проведите пальцем влево, чтобы переместить UIView из одного места в другое, а жест панорамирования также перемещает его, но в зависимости от панорамирования и скорости касания. Благодарю. - person rgb; 28.08.2013
comment
Похоже, что распознаватель панорамирования может позволить вам перемещать вид одним прикосновением, но затем, если будет обнаружено смахивание, вы можете установить флаг, говорящий, что панорамирование перестает работать, поскольку поведение смахивания вступит во владение. Как вы думаете, это может привести к тому, что вы пытаетесь сделать? - person Eric; 28.08.2013
comment
это отличная идея, и это то, чего я пытаюсь достичь, есть ли более простая реализация без написания или переопределения ваших собственных методов touchesBegan, Moved, Ended, чтобы пометить и позволить текущему жесту остановиться и перейти к следующему поведению жеста? Благодарю. - person rgb; 28.08.2013
comment
Да, я предлагаю сохранить ваши методы жестов, вернуть YES из упомянутого мной метода делегата, а затем иметь внутреннее свойство класса (я думаю, BOOL должно быть достаточно), например didSwipe. В начале метода распознавания пролистывания установите для него значение YES — это произойдет только при распознавании пролистывания. В вашем методе панорамирования оберните все это в оператор if: if (!self.didSwipe) {...}, поэтому эта часть будет выполняться только в том случае, если не было свайпа или еще не было свайпа. В какой-то момент вам также может понадобиться позаботиться о сбросе этой переменной. - person Eric; 28.08.2013
comment
спасибо за ваше предложение, я думаю, что решение будет работать. реализую его и посмотрю, смогу ли я получить желаемое поведение. - person rgb; 28.08.2013

Предполагая, что у вас есть какой-то другой обработчик, реализованный для жеста панорамирования, вы не можете просто сделать:

-(void)handleSwipe:(id)sender {

    if //criteria is met to ignore left swipe
    {
        [self handlePan:self];   
    }
}

-(void)handlePan:(id)sender {

    // handle pan gesture here

}
person james00794    schedule 28.08.2013
comment
это может работать, но handlePan (со своей собственной реализацией touchesBegan, Moved, Ended, которая немного сложна для новичка) на самом деле находится в другой библиотеке, используемой на контроллере представления. Благодарю. - person rgb; 28.08.2013