允许单点触摸事件通过 UIScrollView

Posted

技术标签:

【中文标题】允许单点触摸事件通过 UIScrollView【英文标题】:Allowing single touch events to pass through UIScrollView 【发布时间】:2017-04-24 15:01:32 【问题描述】:

我有一个视图 drawingView 用于绘图,我使用 touchesBegan,Moved,End 将曲线添加到渲染它们的子视图 renderingView。我还想在同一屏幕上支持缩放和平移,所以我添加了一个UIScrollView 作为drawingView 的子视图,并在我的scrollView 委托的viewForZooming 方法中返回renderingView

现在,所有的缩放/平移都可以了。 renderingView 放大,仍然布置贝塞尔曲线,我可以平移放大的渲染等。但是,我使用 drawingView 的 touches* 方法实际绘制到 renderingView 的初始功能不再是起作用,因为滚动视图是一个子视图并且正在消耗触摸事件。

我愿意将滚动视图的平移设置为最少两指手势,因此缩放/捏合和平移将是两指手势,为canvasView 处理单指触摸*事件留出空间添加路径信息。

现在,我找到了一种方法(虽然它看起来像一个 hack),通过迭代其手势并检查其平移手势何时将滚动视图的平移手势设置为至少两个手指触摸。但是,将此设置为最少两指触摸,不允许我的canvasView 开始获取触摸事件。我该怎么做?

TL;DR

UIScrollView 子视图正在吞噬其父视图的 touchesBegan/Moved/Ended 事件。我该如何解决这个问题,我愿意将 scrollView 的事件限制为两个手指手势,并让超级视图处理单个手指手势??

【问题讨论】:

【参考方案1】:

考虑使用手势识别器,它会让您的生活更轻松。还可以使用单个视图来获取触摸事件,并将触摸数据传递给其他对象。

使用 UIPinchRecognizer 进行缩放和平移,使用 UIPanRecognizer 进行实际绘图。您可以将 UIPanRecognizer.maximumNumberOfTouches 设置为 1。

您可能需要查看 Apple 的网站以了解实施细节。

https://developer.apple.com/reference/uikit/uigesturerecognizer

【讨论】:

手势的问题在于它们在“参与”之前实际上有一点延迟。导致滞后的绘图体验。其次,滚动视图似乎有 3 个手势,并且很难将它们全部设置为 2 个最小触摸,这样任何 1 个触摸事件都可以干净地通过滚动视图传播。

以上是关于允许单点触摸事件通过 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView:仅在允许时滚动

通过 UITapGestureRecognizer 获取 UIScrollView 中的触摸点

UIScrollview 窃取触摸事件

以 UIScrollView 作为子类的 UIView 不接收触摸事件

UIScrollView 的触摸事件

将触摸事件从 UIVew 传输到 UIScrollView