在 UIScrollView 仍处于活动状态的情况下检测视图中的连续触摸位置

Posted

技术标签:

【中文标题】在 UIScrollView 仍处于活动状态的情况下检测视图中的连续触摸位置【英文标题】:Detect continuous touch position in view with UIScrollView still active 【发布时间】:2016-06-01 06:57:24 【问题描述】:

我有兴趣在视图控制器的视图中获取触摸位置(例如,或模仿 touchesMoved),同时仍保持启用 UIScrollView 子视图。由于所有touchesDidSomething 方法都被UIScrollView 使用,我希望有一种迂回的方式来实现这一点。

以下是我尝试过的一些事情:

子类化 UIScrollView,覆盖它的 touchesMoved 方法并将该触摸信息传递给我的 scrollView's 视图控制器中的 custom delegate 方法。 --> 如果我在滚动 view 上取消选择“可取消的内容触摸”和“延迟内容触摸”,这实际上有效,但它会阻止滚动 view 滚动。

使用与上述相同的策略,但将子类 UIView 作为我的UIScrollView 的兄弟。因此,层次结构如下:

view UIScrollView Subview Subview CustomUIView delegate的自定义UIView

这两种方法都可以在我可以抓取数据的范围内工作,但代价是我的滚动视图不再滚动。我知道我可以在类似于touchesBeganUIScrollView 中获取触摸事件的位置,而scrollView 继续工作,但我还没有找到在滚动时获得连续触摸事件的方法。这可能吗?

这是我所追求的插图:

对于一些关于我为什么要寻找这个以及为什么抓取像 scrollViewDidScrollcontentOffset.x 这样的东西不起作用的元数据,我特别感兴趣的是 scrollView 何时滚动到最后(或开始)并且用户试图继续向前(或向后)滑动,即使scrollView 不能再向滑动方向滚动。发生这种情况时,我想检测向前(或向后)滑动动作以启动到另一个视图的平滑过渡。

【问题讨论】:

如何检测ParentView上的触摸,并用UIScrollview中添加的子视图转换触摸的位置?供参考检查this 【参考方案1】:

我通过在我的视图中添加一个平移手势识别器并使用它的translationInView 方法解决了这个问题(UISwipeGestureRecognizer 没有这个方法)。下面的例子

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(myMethod(_:)))
panGesture.delegate = self
self.addGestureRecognizer(panGesture)

func myMethod(sender: UIPanGestureRecognizer) 
    // sender.translationInView(self).x

还要确保在 UIGestureRegognizerDelegate 中为 shouldRecognizeSimultaneouslyWithGestureRecognizer 返回 true 以说明滚动视图。

【讨论】:

以上是关于在 UIScrollView 仍处于活动状态的情况下检测视图中的连续触摸位置的主要内容,如果未能解决你的问题,请参考以下文章

春季安全删除用户 - 会话仍处于活动状态

Android服务在其仍处于活动状态时停止后台处理

存在-db restxq 触发器:服务已删除但仍处于活动状态

xxx 的副本已从模块树中删除,但仍处于活动状态

当用户关闭应用程序并且任务仍处于活动状态时,NSURLSessionDownloadTask 不会删除文件

反应路径网址并查看更改但组件功能仍处于活动状态。为什么?