如何在uiscrollview内部实现真正的独占触摸?

时间:2019-05-28 07:25:56

标签: ios swift uiscrollview

我将在滚动视图中显示一个图表,当我在图表上拖动时,滚动视图不起作用。

我已经尝试在视图上使用isExclusiveTouch,但无法按预期工作。

当我要触摸图表并在其上拖动手指以显示其他值时,滚动视图会捕获我的触摸事件并发生滚动。

1 个答案:

答案 0 :(得分:0)

我找到了答案。希望这可以帮助。

如果要禁用UIScrollView滚动,则应重写gestureRecognizerShouldBegin方法。检测触摸了哪个视图,以及是否要停止滚动return false,否则必须调用super.gestureRecognizerShouldBegin(gestureRecognizer)

在我的情况下,我在类中定义了一个常量变量,并在要禁用其滚动的视图中将其用作标记。

class CustomScrollView: UIScrollView {

    static let EXCEPTION_FOR_SCROLLING = 1

    var exceptionViews: [UIView]?

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if let view = gestureRecognizer.view {
            if shouldCancelTouch(view, gestureRecognizer) {
                return false
            }
        }
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }

    private func shouldCancelTouch(_ view: UIView, _ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if (exceptionViews?.contains(view) ?? false) || view.tag == CustomScrollView.EXCEPTION_FOR_SCROLLING {
            return true
        } else {
            for i in 0..<view.subviews.count {
                if view.subviews[i].frame.contains(gestureRecognizer.location(in: view)) {
                    if shouldCancelTouch(view.subviews[i], gestureRecognizer) {
                        return true
                    }
                }
            }
        }

        return false
    }

}