0

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

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

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

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

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

  1. 将 UIPanGestureRecognizer 添加到我的 Header 以便它能够检测到拖动
  2. 将 UITapGestureRecognizer 添加到我的 Header 以便它能够检测到点击
  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 无论如何始终为真。

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

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

1 回答 1

1

我也在努力解决这个问题,你应该尝试使用UIGestureRecognizerDelegate允许你同时处理手势的方法。

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

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }
    
于 2020-05-08T22:21:04.403 回答