三重嵌套的UIScrollView分页问题

背景故事
我有一个iPad应用程序,需要允许用户浏览图像组。 每个组都被放置在自己的垂直UIScrollView(分页),所以用户可以上下滑动来查看每个图像。 每个组UIScrollViews被放置在一个单一的(只有一个存在于应用程序中)外部水平UIScrollView(也分页)。 这很好….我可以上下滑动来查看组中的图像,并左右滑动以转到下一个或上一个组。

问题
当我需要为每个图像添加缩放时,问题就开始了。 我通过将每个图像放置在自己的UIScrollView中完成了这个任务。 当图像放大时,我可以平移图像,当我到达缩放图像的顶部或底部时,组的垂直UIScrollView页面按预期显示到下一个或上一个图像。 不幸的是,当图像放大时,外部水平滚动视图将不会翻页到下一组,并且我平移到最左边或最右边。

有没有比三重嵌套UIScrollViews更好(更正确)的方法,或者我可以以某种方式向前触摸外部水平滚动视图?

任何帮助或build议将不胜感激。

希望我不晚,但我想我有你的问题的解决scheme。

在这里您可以find一个Xcode项目,演示您拥有的scrollview设置,您的问题和build议的解决scheme: https ://bitbucket.org/reydan/threescrollviews

基本上,解决scheme是将1像素添加到垂直滚动视图的contentSize.width 。 当您平移到缩放的图像的边缘时,这将强制垂直滚动视图滚动一点。 它滚动一下,然后继续到下一个垂直滚动视图。

如果你下载这个项目,你会看到我在viewDidLoad方法中创build了一些滚动视图。 在那里,我创build了一个包含3个垂直滚动视图的水平滚动视图,每个包含5个图像。 每个图像实际上都包含在滚动视图中以启用每个图像的缩放。 总共…三重嵌套滚动视图。

我还留下了一些彩色边框,以便我可以轻松看到每个滚动视图的滚动方式。

  • 品红=水平滚动视图
  • 白色=垂直滚动视图
  • 蓝色=图像滚动视图(包含图像并允许缩放的图像)
  • 红色= UIImageView

你会看到我已经标记每个图像滚动视图值10.这是用于实现- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView委托方法,其中我返回nil除非事件来自图像scrollviews 。

如果您对我提出的项目有任何疑问,请随时询问。

最后 ,我想说,这个浏览方法对我来说有点古怪,因为我有时会滚动到不想要的方向。 通常我想我只是垂直滑动我的手指,只是为了find向左或向右的滚动视图,因为它解释了我所做的一些微小的水平移动。

我发现分页启用水平和垂直运动的问题是滚动视图是方向locking的,或者对我来说似乎是这样。

编辑:

今天我已经调查了这个问题。 这些是我的结论:

  • 这不是一个缩放问题,这是一个问题,在最里面的滚动视图比可见区域更大的内容(你可以尝试通过缩放或初始化内容的大小比边界大)。 这使得能够在最内侧滚动视图内进行平移,并完全改变了触摸事件的行为。

  • 滚动视图标志的反弹会影响平移(拖动)手势到达内容边缘时的行为。 如果bounces=false则平移手势将在边缘停止,而不是在链上向前拖动拖动事件(因此不滚动父滚动视图以显示其他图像)。 如果bounces=true那么当您到达边缘并继续拖动时,事件将被转发到父滚动视图,并且该滚动视图也将被拖动。 但是,我发现,在弹跳的同时拖动大约减less了50%的距离。 这也发生在照片应用程序。

  • 如果你在内部滚动视图位于内容的边缘时开始拖动,那么滚动视图是非常聪明的,并且将所有事件转发到父滚动视图。

  • 由于某些原因,三重嵌套滚动视图是有问题的,因为事件并不是在最上面的滚动视图和中间的滚动视图之间转发,而是在最内侧的滚动视图内进行移动。 我不知道为什么。

我的解决scheme与+1像素的内容大小,部分解决了这个问题。

编辑2013年

男孩,这些scrollviews是这个世界的东西:(

经过一年多的search(只是在开玩笑…实际上是2天),我想我find了一个很好的三层嵌套滚动视图的优雅的解决scheme。 我在这里创build了一个testing项目: https : //github.com/reydanro/TripleNestedScrollViews

在应用程序内部,有一个开关,您可以使用该开关进行testing。

我在我的应用程序中使用的设置有点不同于这个问题。 我有1垂直分页滚动视图。 在里面,我有多个横向分页滚动视图。 在一些水平滚动视图中,我有另一个垂直分页滚动视图。

没有修复 ,一旦你到达最内层滚动视图的页面,你几乎被卡在那里,因为垂直滚动手势不会被转发到最外面的滚动。

该修复程序是您需要添加到最内层滚动视图的自定义UIGestureRecognizer。 此识别器遵循触摸事件,如果检测到超出contentArea的拖动,则会暂时禁用其余的滚动视图识别器。 这是我发现使滚动视图向前发展链上的事件的唯一方法

手势识别器的代码是非常粗糙,有限的定制,但应该完成工作。 目前我专注于开发的应用程序,但将继续更新存储库。

PS:我还没有testing缩放会发生什么,但我看不出为什么这种方法不应该工作(或适应工作)的原因。