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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift isUserInteractionEnabled = false在UITapGestureRecognizer内部不起作用相关的知识,希望对你有一定的参考价值。

我在主视图中有一个UIScrollView和一个Header(UIView)并且我的Header像这样在我的UIScrollView上方时出现了问题:

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

我希望标题能够检测到其上的点击,但是我也希望滚动到标题上方时滚动视图能够滚动,由于我的标题位于上方并且正在阻止标题,因此目前无法实现滚动。

所以看起来很简单吧?,我希望我的标题能够检测到水龙头,但是将滚动前进到我的UIScrollView。

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

  1. 向我的页眉添加UIPanGestureRecognizer,以便能够检测到拖动
  2. 将UITapGestureRecognizer添加到我的标题中,以便能够检测到轻敲
  3. 开始拖动时设置isUserInteractionEnabled = false,因此可以将手势传递给下一个UIResponder,在这种情况下为我的UIScrollView
  4. 设置isUserInteractionEnabled = true,一旦我的拖动完成,以便它可以再次检测到轻击

这是代码段:

    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始终为true,无论如何。

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

  • 覆盖UIButton覆盖内的hitTest函数
  • touchesBegan,touchesMoved,touchesEnded方法覆盖下一个
  • 返回ScrollView作为下一个UIResponder设置的变量
  • UIButton中的isExclusiveTouch方法更改
  • isUserInteractionEnabled以各种可能的方式
  • 等,等等,等等...
答案

我也在这个问题上也很挣扎,您应该尝试使用UIGestureRecognizerDelegate的方法,该方法允许您同时处理手势。

  1. 连接您的手势识别器代表,例如tapGestureRecognizer.delegate = self
  2. [使您的ViewController遵守此协议,例如extension YourViewController: UIGestureRecognizerDelegate {}
  3. 实现此功能:

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

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

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

无法在 Swift 中滚动 textview

示例 AVCAM - Swift Xcode v9

在哪里设置 NavigationController.NavigationBar.isUserInteractionEnabled

tvos swift spritekit - UITapGestureRecognizer 没有响应

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