Iphone 如何为UIScrollView过滤触摸事件?

Iphone 如何为UIScrollView过滤触摸事件?,iphone,uiscrollview,touch-event,Iphone,Uiscrollview,Touch Event,我有一个显示PDF的视图。它应该是可缩放的,所以我还创建了一个UIScrollView,并在其委托中实现了viewForZoomingInScrollView以返回PDF视图。到现在为止,一直都还不错。 但是,当用户到达缩放的PDF页面的边缘时,我希望切换到下一页。听起来很容易,但我似乎不知道怎么做 我尝试了一些不同的方法: 使用scrollViewDidScroll检测滚动是否已到达边缘。这里的问题是,如果zoomScale为1,因此无法滚动,则永远不会调用此函数。但是UIScrollView

我有一个显示PDF的视图。它应该是可缩放的,所以我还创建了一个UIScrollView,并在其委托中实现了viewForZoomingInScrollView以返回PDF视图。到现在为止,一直都还不错。 但是,当用户到达缩放的PDF页面的边缘时,我希望切换到下一页。听起来很容易,但我似乎不知道怎么做

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

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

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

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

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

  • 看起来UIScrollView所做的一切都不是从ToucheSBegind/touchesMoved启动的,而是在这之前它会收到一些关于触摸方式的通知。可能是以某种我无法拦截或复制的未记录方式


    那么,是否有任何方法可以在仍然能够使用(当某些条件适用时)UIScrollView进行缩放和滚动的情况下,获得有关通过UIScrollView进行的所有触摸移动的通知?

    好的,下面是我最后做的:

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

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

    • 此子类有一个指向ViewController的属性
    • 使用touchesXXX方法,我跟踪当前的触摸计数
    • 我将所有触摸事件转发到ViewController

    • 最后,我覆盖了ToucheShouldCancelIncontentView:,并在zoomScaleOk时返回NO,下面是我最后所做的:

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

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

      • 此子类有一个指向ViewController的属性
      • 使用touchesXXX方法,我跟踪当前的触摸计数
      • 我将所有触摸事件转发到ViewController
      • 最后,我已经覆盖了ToucheShouldCancelIncontentView:,并在缩放时返回NO