【问题标题】:How to filter touch events for a UIScrollView?如何过滤 UIScrollView 的触摸事件?
【发布时间】:2011-02-27 04:57:09
【问题描述】:

我有一个显示 PDF 的视图。它应该是可缩放的,所以我还创建了一个 UIScrollView,并在它的委托中实现了 viewForZoomingInScrollView 以返回 PDF 视图。到目前为止,一切都很好。 但是,当用户到达缩放的 PDF 页面的边缘时,我想翻到下一页。听起来很简单,但我似乎无法弄清楚如何去做。

我尝试了一些不同的方法:

  1. 使用 scrollViewDidScroll 来检测滚动是否到达边缘。这里的问题是,如果 zoomScale 为 1,因此无法滚动,则永远不会调用此函数。但是 UIScrollView 仍然吞下所有的触摸事件,所以我也无法检测到 touchesMoved 到达边缘。不放大时将 canCancelContentTouches 设置为 NO 不是一个选项,因为这也会阻止放大。

  2. 子类化 UIScrollView,并将一些触摸事件转发给下一个响应者。不幸的是,当 UIScrollView 检测到拖动操作并取消触摸时,即使 UIScrollView 子类也不再调用 touchesMoved 和 touchesEnded。同样,将 canCancelContentTouches 设置为 NO 并不好,因为这也会阻止某些所需的 UIScrollView 功能。

  3. 在滚动视图之上创建一个透明视图(作为它的兄弟),以便此视图首先获取所有触摸事件,然后将一些触摸转发到滚动视图。不幸的是,滚动视图没有响应这些调用。

  4. 我不能使用 touchesShouldCancelInContentView,因为它没有将实际的触摸作为参数,而且我是否希望滚动视图处理触摸事件还取决于触摸事件本身的属性(例如,我们已经在边缘的方向上的触摸移动不应该被滚动视图取消,但可以取消在另一个方向上的移动)。

看起来 UIScrollView 正在做的任何事情都不是从 touchesBegan / touchesMoved 发起的,而是它在之前收到一些关于触摸方式的通知。可能以某种我无法拦截或复制的无证方式。

那么有没有什么方法可以在 UIScrollView 上获得所有触摸动作的通知,同时仍然能够使用(当某些条件适用时)UIScrollView 进行缩放和滚动?

【问题讨论】:

    标签: iphone uiscrollview touch-event


    【解决方案1】:

    好的,这就是我最后所做的:

    • 将所有的滚动和放大都留给 UIScrollView,并在 UIScrollViewDelegate 的 scrollViewDidEndDragging:willDecelerate: 中处理翻页是几乎的一种解决方案,只是如果整个内容都在屏幕上,则永远不会调用此函数,因此无法拖动/滚动。
    • 在这种情况下,滑动是在 ViewController 的 touchesBegan / touchesEnded 函数中处理的,但要使其正常工作,我们需要确保 UIScrollView 不会取消这些事件。但是,在其他情况下,UIScrollView 应该能够取消触摸,以便它可以进行缩放和滚动。
    • UIScrollView 应该能够取消触摸,如果:
      • 滚动是可能的(并且需要),因为整个内容不适合屏幕(在我的例子中,zoomScale > 1), 或
      • 用户用两根手指触摸屏幕,以便放大和缩小工作。
    • 当无法滚动,并且用户单点触摸屏幕时,不应取消触摸,并且应将触摸事件转发到视图控制器。

    • 所以我创建了一个 UIScrollView 子类。

    • 这个子类有一个指向 ViewController 的属性。
    • 使用 touchesXXX 方法我可以跟踪当前的触摸计数。
    • 我将所有触摸事件转发到 ViewController。
    • 最后,我重写了 touchesShouldCancelInContentView:,并在 zoomScale

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多