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内部不起作用
在哪里设置 NavigationController.NavigationBar.isUserInteractionEnabled
tvos swift spritekit - UITapGestureRecognizer 没有响应
navigationController?.navigationBar.isUserInteractionEnabled 未按预期工作