UIPanGestureRecognizer - только вертикальный или горизонтальный - PullRequest
139 голосов
/ 18 августа 2011

У меня есть вид, у которого есть UIPanGestureRecognizer для перетаскивания вида по вертикали.Поэтому в обратном вызове распознавателя я только обновляю координату y, чтобы переместить его.Суперпредставление этого вида имеет UIPanGestureRecognizer, которое будет перетаскивать представление по горизонтали, просто обновляя x-координату.

Проблема в том, что первый UIPanGestureRecognizer принимает событие для перемещения представления по вертикали,поэтому я не могу использовать жест superview.

Я пробовал

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
 shouldRecognizeSimultaneouslyWithGestureRecognizer:
                            (UIGestureRecognizer *)otherGestureRecognizer;

, и оба будут работать, но я этого не хочу.Я хочу, чтобы горизонтали были обнаружены, только если движение четко горизонтальное.Так что было бы здорово, если бы у UIPanGestureRecognizer было свойство direction.

Как мне добиться этого поведения?Я нахожу документы очень запутанными, поэтому, возможно, кто-то сможет объяснить это лучше здесь.

Ответы [ 21 ]

0 голосов
/ 26 сентября 2016

Я взял отличный ответ от Ли Гудрича и портировал его на Swift 3

import UIKit
import UIKit.UIGestureRecognizerSubclass

enum PanDirection {
    case vertical
    case horizontal
}

class PanDirectionGestureRecognizer: UIPanGestureRecognizer {

    let direction : PanDirection

    init(direction: PanDirection, target: AnyObject, action: Selector) {
        self.direction = direction
        super.init(target: target, action: action)
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {

        super.touchesMoved(touches, with: event)

        if state == .began {

            let vel = velocity(in: self.view!)

            switch direction {

            case .horizontal where fabs(vel.y) > fabs(vel.x):
                state = .cancelled

            case .vertical where fabs(vel.x) > fabs(vel.y):
                state = .cancelled

            default:
                break

            }

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...