swift isUserInteractionEnabled = false 在 UITapGestureRecognizer 内不起作用

Posted

技术标签:

【中文标题】swift isUserInteractionEnabled = false 在 UITapGestureRecognizer 内不起作用【英文标题】:swift isUserInteractionEnabled = false not working inside UITapGestureRecognizer 【发布时间】:2020-05-08 21:48:15 【问题描述】:

我有一个问题,我的主视图中有一个 UIScrollView 和一个标题 (UIView),而我的标题位于我的 UIScrollView 上方:

UIView.
|
|- UIScrollView.
|
|- Header. (UIView)

我希望我的标题能够检测到对其的点击,但我也希望我的滚动视图能够在我拖动我的标题时滚动,这现在是不可能的,因为我的标题在它上面并且正在阻塞卷轴。

总而言之,我希望我的 Header 检测到点击但向前滚动到我的 UIScrollView。

为了解决这个问题,我尝试了多种方法,以下是其中的一些:

    将 UIPanGestureRecognizer 添加到我的 Header 以便它能够检测到拖动 将 UITapGestureRecognizer 添加到我的 Header 以便它能够检测到点击 开始拖动时设置 isUserInteractionEnabled = false,以便可以将手势传递给下一个 UIResponder,在本例中是我的 UIScrollView 拖动完成后设置 isUserInteractionEnabled = true,以便再次检测到点击

这是代码sn-p:

    override func viewLoad() 
        myScreenEdgePanGestureRecognizer = UIPanGestureRecognizer(target: self, action:#selector(handlePan))
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:#selector(handleTap(_:)))
        headerView.addGestureRecognizer(myScreenEdgePanGestureRecognizer)
        headerView.addGestureRecognizer(tapGestureRecognizer)
    

    @objc func handlePan(_ sender: UITapGestureRecognizer)
        print("dragging")
        if headerView.isUserInteractionEnabled
            headerView.isUserInteractionEnabled = false
        
        if sender.state == .began 
         else if sender.state == .ended 
            headerView.isUserInteractionEnabled = true
        
    

    @objc func handleTap(_ sender: UITapGestureRecognizer)
        print("tapped")
    

在这一点上,我看到拖动和点击是如何被检测到的,但由于某种原因 isUserInteractionEnabled = false 似乎并没有改变视图的行为方式。这段代码充当 isUserInteractionEnabled 无论如何都是真的。

除此之外我还尝试过的事情:

覆盖 UIButton 中的 hitTest 函数 覆盖 touchesBegan、touchesMoved、touchesEnded 方法覆盖 next 设置变量以将 ScrollView 作为下一个 UIResponder 返回 在 UIButton 中设置 isExclusiveTouch 方法 以各种可能的方式更改 isUserInteractionEnabled

【问题讨论】:

是的,如果你从一开始就将 isUserInteractionEnabled = false 设置为标题视图并拖动它,它将自动发送到 UIScrollView 无论如何 【参考方案1】:

我也遇到过这个问题,你应该尝试使用UIGestureRecognizerDelegate的方法,它可以让你同时处理手势。

    连接您的手势识别器代表,例如tapGestureRecognizer.delegate = self 使您的 ViewController 符合此协议,例如 extension YourViewController: UIGestureRecognizerDelegate

    实现这个功能:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool  return true 
    

【讨论】:

所以我这样做了,但是当我在我的 Header 中拖动时,我仍然无法滚动我的 UIScrollView :( 我错过了你在滚动视图中没有 headerView,因为你不想粘页眉?比你需要手动滚动scrollView。 PanGestureRecognizer 现在工作正常吗?我将删除handlePan 中设置isUserInteractionEnabled 的行。我会使用 sender.translation 来设置 scrollView.contentOffset。 这是滚动 UIScrollView 背后的一种可能方式,但问题是滚动不会感觉就像你从 UIScrollView 本身滚动一样,它不会有同样的平滑度,这就是我尝试使用的原因isUserInteractionEnabled,因为当 isUserInteractionEnabled = false 时,scrollView 上的滚动就像您从 UIScrollView 本身滚动一样。

以上是关于swift isUserInteractionEnabled = false 在 UITapGestureRecognizer 内不起作用的主要内容,如果未能解决你的问题,请参考以下文章

swift isUserInteractionEnabled = false在UITapGestureRecognizer内部不起作用

无法在 Swift 中滚动 textview

示例 AVCAM - Swift Xcode v9

在哪里设置 NavigationController.NavigationBar.isUserInteractionEnabled

tvos swift spritekit - UITapGestureRecognizer 没有响应

navigationController?.navigationBar.isUserInteractionEnabled 未按预期工作