Есть ли какое-либо приоритетное условие между методами жестов (Pan Gesture и Swipe Gesture)? - PullRequest
11 голосов
/ 02 февраля 2011

Я занимаюсь разработкой приложения, в котором я использовал Pan Gesture и Swipe Gesture. Поэтому каждый раз, когда я делаю Жест Размах, но всегда вызывается метод из Пан Жест, а метод Жест Размах не вызывается.

Есть ли приоритет между всеми методами жестов?

Ответы [ 3 ]

14 голосов
/ 14 апреля 2012

Вы можете вызывать их параллельно, реализовав следующий метод протокола UIGestureRecognizerDelegate:

- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
9 голосов
/ 03 февраля 2011

В классе UIGestureRecognizer есть свойство с именем "cancellsTouchesInView", по умолчанию YES. Это приведет к отмене любых ожидающих жестов. Жест панорамирования распознается первым, так как ему не требуется событие «подправки», поэтому он отменяет жест «Размах».

Если вы хотите, чтобы оба жеста были распознаны, попробуйте добавить:

[yourPanGestureInstance setCancelsTouchesInView:NO];

2 голосов
/ 13 января 2018

Отдайте приоритет свайпу

Вы можете отдать приоритет UIGestureRecognizer с помощью метода require(toFail:).

@IBOutlet var myPanGestureRecognizer: UIPanGestureRecognizer!
@IBOutlet var mySwipeGestureRecognizer: UISwipeGestureRecognizer!

myPanGesture.require(toFail: mySwipeGestureRecognizer)

Теперь ваша панорама будет выполняться только в случае сбоя . .


Использовать pan для всего

Если swipe и pan распознаватели жестов не очень хорошо работают с этой настройкой, вы можете свернуть всю свою логику в pan распознаватель жестов для большего контроля.*

let minHeight: CGFloat = 100
let maxHeight: CGFloat = 700
let swipeVelocity: CGFloat = 500
var previousTranslationY: CGFloat = 0

@IBOutlet weak var cardHeightConstraint: NSLayoutConstraint!

@IBAction func didPanOnCard(_ sender: Any) {

    guard let panGesture = sender as? UIPanGestureRecognizer else { return }

    let gestureEnded = bool(panGesture.state == UIGestureRecognizerState.ended)
    let velocity = panGesture.velocity(in: self.view)

    if gestureEnded && abs(velocity.y) > swipeVelocity {
        handlePanOnCardAsSwipe(withVelocity: velocity.y)
    } else {
        handlePanOnCard(panGesture)
    }
} 

func handlePanOnCard(_ panGesture: UIPanGestureRecognizer) {

    let translation = panGesture.translation(in: self.view)
    let translationYDelta = translation.y - previousTranslationY

    if abs(translationYDelta) < 1 { return } // ignore small changes

    let newCardHeight = cardHeightConstraint.constant - translationYDelta

    if newCardHeight > minHeight && newCardHeight < maxHeight {
        cardHeightConstraint.constant = newCardHeight
        previousTranslationY = translation.y
    }

    if panGesture.state == UIGestureRecognizerState.ended {
        previousTranslationY = 0
    }
}

func handlePanOnCardAsSwipe(withVelocity velocity: CGFloat) {
    if velocity.y > 0 {
        dismissCard() // implementation not shown
    } else {
        maximizeCard() // implementation not shown
    }
}

Вот демонстрация приведенного выше кода в действии.

enter image description here

...