2010-06-03 107 views
2

我有一个显示PDF的视图。它应该是可缩放的,所以我也创建了一个UIScrollView,并在其委托中实现了viewForZoomingInScrollView以返回PDF视图。到现在为止还挺好。 但是,当用户到达放大的PDF页面的边缘时,我想翻到下一页。听起来很容易,但我似乎无法弄清楚如何去做。如何过滤UIScrollView的触摸事件?

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

  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用于缩放和滚动?

回答

0

好了,这里就是我做到底:

  • 使所有的滚动和缩放最多的UIScrollView,并在UIScrollViewDelegate的scrollViewDidEndDragging处理转到页willDecelerate:是几乎的解决方案,除了如果整个内容在屏幕上,此功能从不会被调用,所以拖放/滚动是不可能的。
  • 在这种情况下,Swipe在ViewController的touchesBegan/touchesEnded函数中处理,但为了这个工作,我们需要确保UIScrollView不会取消这些事件。但是,在其他情况下,UIScrollView应该能够取消触摸,以便它可以进行缩放和滚动。
  • 的UIScrollView中应该能够抵消触摸,如果:
    • 滚动是可能的(需要),因为整个内容不适合在屏幕上(zoomScale> 1在我的情况), 或
    • 的用户用两个手指触摸屏幕,以便放大和缩小。
  • 当滚动是不可能的,并且用户单击屏幕,那么触摸不应该被取消,触摸事件应该被转发到视图控制器。

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

  • 该子类有一个指向ViewController的属性。
  • 使用touchesXXX方法我跟踪当前的触摸计数。
  • 我将所有触摸事件转发给ViewController。
  • 最后,我重写touchesShouldCancelInContentView:和返回NO时zoomScale < = 1和touchCount == 1