OGeek|极客世界-中国程序员成长平台

标题: ios - 如何禁用 UIScrollView 到平移手势识别器? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 18:36
标题: ios - 如何禁用 UIScrollView 到平移手势识别器?

当平移手势识别器(我们称之为 SomePanGestureRecognizer)被调用时,如何禁用或强制使 UIScrollView 中的手势识别器失败?

gestureRecognizer(_:shouldBeRequiredToFailBy 方法采用手势识别器参数,而不是平移手势识别器,我不知道这是我无法让它工作的原因还是因为我出现语法错误。

我有 UIScrollView 子类,用于强制失败的方法在下面的委托(delegate)中:

class CustomScrollView: UIScrollView {

    override init(frame: CGRect) {
        super.init(frame: frame)

        configure()

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        configure()

    }

    private func configure() {

        isScrollEnabled = true
        showsHorizontalScrollIndicator = false
        showsVerticalScrollIndicator = false
        isPagingEnabled = true
        bounces = false
        alwaysBounceVertical = false
        alwaysBounceHorizontal = false

    }

}

// gesture recognizer delegate
extension CustomScrollView: UIGestureRecognizerDelegate {   

    // allow simultaneous gestures
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

    // force failure
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {

        // TLDR: disable uiscrollview when SomePanGestureRecognizer is called

    }

}


这是需要强制 UIScrollView 中的手势识别器失败的平移手势识别器:

func addSomePanGestureRecognizer() {
    SomePanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(oneBPanGestureHandler(gesture))
    oneBHandle.addGestureRecognizer(SomePanGestureRecognizer)
}



更新我将 UIPanGestureRecognizer 子类化并使用同步委托(delegate)使其工作,但我担心这是一种不稳定的方法,因为我依赖 UIKit 在自定义平移手势之前始终禁用 UIScrollView .

// gesture recognizer delegate
extension CustomScrollView: UIGestureRecognizerDelegate {

    // simultaneous gestures
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {

        if otherGestureRecognizer is CustomPanGestureRecognizer {
            return false
        } else {
            return true
        }

    }

}


UPDATE 2 这也有效,但我不知道为什么,因为我觉得它不应该。不应该反过来吗?

// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {

    if otherGestureRecognizer is CustomPanGestureRecognizer {
        return true
    } else {
        return false
    }

}



Best Answer-推荐答案


我相信这就是您要找的:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
   let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is SomePanGestureRecognizer
   return !isPanAndOtherRecognizer
}

// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {

   let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is SomePanGestureRecognizer
   return isPanAndOtherRecognizer
}

关于ios - 如何禁用 UIScrollView 到平移手势识别器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46008225/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4