我有一个问题,我的主视图中有一个 UIScrollView 和一个 Header (UIView),而我的 Header 位于我的 UIScrollView 之上:
UIView.
|
|- UIScrollView.
|
|- Header. (UIView)
我希望我的标题能够检测到对其的点击,但我也希望我的滚动视图能够在我拖动我的标题时滚动,这现在是不可能的,因为我的标题在它上面并且阻止了滚动。
总而言之,我希望我的 Header 检测到点击但向前滚动到我的 UIScrollView。
为了解决这个问题,我尝试了多种方法,以下是其中一些:
- 将 UIPanGestureRecognizer 添加到我的 Header 以便它能够检测到拖动
- 将 UITapGestureRecognizer 添加到我的 Header 以便它能够检测到点击
- 拖动开始时设置 isUserInteractionEnabled = false 以便可以将手势传递给下一个 UIResponder ,在这种情况下是我的 UIScrollView
- 拖动完成后设置 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