检测 UIScreenEdgeGestureRecognizer 并使 UIPanGestureRecognizer 失败

Detect UIScreenEdgeGestureRecognizer and fail UIPanGestureRecognizer

在我的 ViewController 中,我有一个用于切换视图的 UIScreenEdgeGestureRecognizer,还有一个带有自定义 UITableViewCellUITableView。在这个习惯中 UITableViewCell 是一个 UIPanGestureRecognizer 用于滑动单元格。

我添加了 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 以便两个手势都有效,gestureRecognizerShouldBegin 以防止垂直滚动的冲突。

问题是,如何给 UIScreenEdgeGestureRecognizer 优先权?当我在屏幕边缘滑动时,我想在不平移单元格的情况下切换视图。我想我应该使用委托方法,但到目前为止,我读得越多,我就越困惑。

自定义代码 UITableViewCell:

override func viewDidload() {
    var recognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
    recognizer.delegate = self
    addGestureRecognizer(recognizer)
}

override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    if let panGesture = gestureRecognizer as? UIPanGestureRecognizer {
        let velocity = panGesture.velocityInView(superview!)
        if fabs(velocity.x) > fabs(velocity.y) { return true }
        return false
    }
    return false
}

ViewController:

override func viewDidLoad() {
    let rightScreenEdgeRecognizer = EdgePanGesture(target: self, action: "changeView:")
    rightScreenEdgeRecognizer.edges = .Right
    view.addGestureRecognizer(rightScreenEdgeRecognizer)
}

我还尝试用以下方法识别识别器:

gestureRecognizer.isKindOfClass(UIScreenEdgePanGestureRecognizer)

gestureRecognizer as? UIScreenEdgePanGestureRecognizer

但都失败了。

结果我用 gestureRecognizer as? UIScreenEdgePanGestureRecognizer 寻找了正确的方向,但我应该使用 otherGestureRecognizer.

而不是 gestureRecognizer
override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOfGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if let recognizer = otherGestureRecognizer as? UIScreenEdgePanGestureRecognizer {
        return true
    }
    return false
}