3

所以这是交易:

  1. 我有一个带有集合视图(子视图)的视图,其内容高于其边界高度。所以集合视图将允许垂直滚动以查看其所有项目。
  2. 此外,此集合视图位于 aprox。超过其超级视图底部(vc主视图)的一半高度。也就是说,一半的集合视图“隐藏”在屏幕底部之后。
  3. 我正在使用 UIKit Dynamics 来允许上下拖动集合视图。它的静止位置如 2 中所述。它的“扩展”位置一直到 vc 的导航栏。

为了触发动态,我在主 vc 视图(集合视图的超级视图)上附加了一个 UIPanGestureRecognizer,如果它检测到在集合视图所在的位置开始拖动,它会启动动态过程以将其拉上或拉下。

然而,我试图实现的行为是:

  1. 如果集合视图折叠(底部),拖动应该通过动态将其拉起,但不允许集合视图的平移识别器使其同时滚动。
  2. 一旦我在向上拉集合视图方面达到我的目标高度,集合视图也应该开始响应我的手势,在集合视图内沿垂直方向滚动。这种对集合视图的切换也响应手势需要是连续的。也就是说,如果我scrollEnabled根据其在超级视图中的位置设置集合视图,这将不起作用:手势已经在处理中,因此集合视图在我结束当前手势并开始一个新手势之前不会开始滚动。

那么有没有办法让集合视图中的手势识别器知道一个手势正在进行中,并让它开始识别那个手势,即使它已经被超级视图识别器处理了?

更新:

在这一点上,我什至会选择一个包含两个嵌套滚动视图的解决方案。如果有人有兴趣,我尝试了一个小项目。还远远不能接受。以下是嵌套滚动视图方法的主要问题:

  1. 默认情况下,滚动视图(和子类)不响应当前正在进行的手势的问题scrollEnabled设置为 YES,无论处理 2 个滚动视图或手势识别器和滚动视图。
  2. 我通过子类化有问题的类(在我的示例中,一个表视图和一个滚动视图)并操作scrollEnabled属性以及-setContentOffset:设置视图的识别器以同时识别来解决了这个问题。在这一点上,我终于可以scrollEnabled任意设置滚动视图(或子类)并让它们响应正在进行的手势。

但后来我面临其他一些问题:

  1. 根据在我将视图设置为 YES 之前手势是否已经持续了一段时间scrollEnabled,视图开始获取消息以将其内容偏移设置为不正确的值。也就是说,如果在父滚动视图达到其最大内容偏移量之前禁用 tableview 滚动,则在手势仍在进行时打开 tableview 以响应手势会导致它尝试滚动到父视图的 contentOffset 而不是从 0 开始的下一步值(因为直到此时它的内容偏移量实际上是 0)。
  2. 根据手势是连续平移超过父滚动视图的最大偏移量然后再次向下移动,还是两次离散滑动(向上一次,向下一次),我也会得到不同的偏移量结果。
  3. 当将 tableview 拉到其内容偏移量应为 <= 0 并在父视图中再次启用滚动时,即使我将值四舍五入到0。

示例项目

4

1 回答 1

2

您需要实现 's 的方法-gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:以在传递的手势识别器是您的 's时返回。UIPanGestureRecognizerdelegateYESUICollectionViewpanGestureRecognizer

然后,最初将您UICollectionView的 's设置scrollEnabledNO. 一旦你UICollectionView达到目标高度(根据你的移动UIPanGestureRecognizer),将你UICollectionView的设置scrollEnabledYES并开始忽略你自己的事件UIPanGestureRecognizer

或者,您可以将您UICollectionView的父母放入父母UIScrollView以获得类似的结果。

于 2013-11-14T10:27:35.860 回答