我有一个显示PDF的视图。它应该是可缩放的,所以我也创建了一个UIScrollView,并在其委托中实现了viewForZoomingInScrollView以返回PDF视图。到现在为止还挺好。 但是,当用户到达放大的PDF页面的边缘时,我想翻到下一页。听起来很容易,但我似乎无法弄清楚如何去做。如何过滤UIScrollView的触摸事件?
我已经尝试了一些不同的方法:
使用scrollViewDidScroll来检测,如果滚动已经达到了边缘。这里的问题是,如果zoomScale是1,因此不可能滚动,那么这个函数永远不会被调用。但是UIScrollView仍然会吞下所有的触摸事件,所以我也无法检测到touchesMoved中的边缘。如果不缩放不是一个选项,则将canCancelContentTouches设置为NO,因为这样也会阻止放大。
子类化UIScrollView,并将某些触摸事件转发给下一个响应者。不幸的是,当UIScrollView检测到拖动操作并取消触摸时,即使对于UIScrollView子类,touchesMoved和touchesEnded也不会被调用。同样,将canCancelContentTouches设置为NO也不好,因为这也会阻止某些所需的UIScrollView功能。
在滚动视图(作为其兄弟)顶部创建一个透明视图,以便此视图首先获取所有触摸事件,然后将某些触摸转发给滚动视图。不幸的是,滚动视图不响应这些调用。
我不能使用touchesShouldCancelInContentView,因为没有得到实际的触摸作为参数,我是否希望滚动视图处理触摸事件也取决于触摸事件本身的属性(例如,我们已经处于边缘的方向上的触摸移动不应该被滚动视图取消,而是在另一方向上的移动可能是)。
看起来像什么的UIScrollView正在做的是不从的touchesBegan/touchesMoved发起的,而是它得到的触摸方式之前一些通知。可能以一些我无法拦截,无法复制的无证方式。
那么有没有什么办法可以通过UIScrollView获得关于所有触摸动作的通知,同时仍然可以使用(当某些条件适用时)UIScrollView用于缩放和滚动?