ScrollView平移手势与panGestureRecognizer之间的冲突

Tig*_*yan 6 uiscrollview ios uipangesturerecognizer swift

UIScrollView在中有一个UIViewController,由segue模态显示,另外一个UIPanGestureRecognizer确实通过pan关闭了视图控制器。此手势仅在以下情况下有效

 scrollView.contentOffset.y == 0
Run Code Online (Sandbox Code Playgroud)

问题是,现在两个平移手势相互冲突,我无法再滚动视图。

为了解决这个问题,我尝试使用gestureRecognizer(_: shouldRecognizeSimultaneouslyWith:)方法,返回yes,并且还尝试将自定义的平移手势添加到UIScrollView平移手势识别器中,如下所示:

 scrollView.panGestureRecognizer.addTarget(self, action: #selector(handlePanGesture(_:)))
Run Code Online (Sandbox Code Playgroud)

但是这些并不能解决问题。如果您知道如何解决此问题,请多多帮助。

已编辑

这是我的平移手势的代码,可消除视图控制器:

     @IBAction func handlePanGesture(_ sender: UIPanGestureRecognizer) {
    let percentThreshold: CGFloat = 0.3

    if scrollView.contentOffset.y == 0 {
        let translation = sender.translation(in: view)
        let verticalMovement = translation.y / view.bounds.height
        let downwardMovement = fmaxf(Float(verticalMovement), 0.0)
        let downwardMovementPercent = fminf(downwardMovement, 1.0)
        let progress = CGFloat(downwardMovementPercent)

        guard let interactor = interactor else {return}
        switch sender.state {
        case .began:
            interactor.hasStarted = true
            dismiss(animated: true, completion: nil)
        case .changed:
            interactor.shouldFinish = progress > percentThreshold
            interactor.update(progress)
        case .cancelled:
            interactor.hasStarted = false
            interactor.cancel()
        case .ended:
            interactor.hasStarted = false
            interactor.shouldFinish ? interactor.finish() : interactor.cancel()
        default:
            break
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

EDITED_2 这是以下代码Interactor

class Interactor: UIPercentDrivenInteractiveTransition {
var hasStarted = false
var shouldFinish = false 
Run Code Online (Sandbox Code Playgroud)

}

附言:我知道有很多类似的问题,但它们对我不起作用。

bnu*_*sey 6

要在 aUIPanGestureRecognizer位于 ScrollView 上时允许滚动,您需要创建一个UIGestureRecognizerDelegate返回 true 的gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)

如果不这样做,将无法在 ScrollView 上滚动。

这是这样做的:

let scrollViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(onPan(_:)))
scrollViewPanGesture.delegate = self
scrollView.addGestureRecognizer(scrollViewPanGesture)

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)


Sh_*_*han 0

在滚动视图下添加一个子视图并向其添加平移手势,而不是将其添加到 self.view ,这肯定会与滚动视图的冲突