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