使 UIGestureRecognizer 响应已在进行中并被另一个识别器识别的手势



所以这是交易:

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

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

但是,我试图实现的行为是:

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

那么,有没有办法让集合视图中的手势识别器意识到手势正在进行中,并让它开始识别该手势,即使它已经由超级视图识别器处理?

更新:

在这一点上,我什至会满足于具有两个嵌套滚动视图的解决方案。如果有人感兴趣,我做了一个小项目。这仍然远远不能接受。以下是嵌套滚动视图方法的主要问题:

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

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

  1. 根据在我将视图scrollEnabled设置为 EYES 之前手势是否已经存在了一段时间,视图开始接收消息以将其内容偏移量设置为不正确的值。也就是说,如果表视图滚动被禁用,直到父滚动视图达到其最大内容偏移量,则在手势仍在进行时打开表视图以响应手势会导致它尝试滚动到父视图的 contentOffset 而不是从 0 开始的下一步值(因为到目前为止,其内容偏移量实际上为 0)。
  2. 根据手势是连续向上平移超过父滚动视图的最大偏移量,然后再次向下平移,或者代替 2 次离散滑动(一次向上,一次向下),我也得到不同的偏移结果。
  3. 当将 TableView 向下拉到其内容偏移量应为 <= 0 并在父视图中再次启用滚动时,表视图并不总是完全与其内容偏移量 0 完全对齐,即使我将值舍入为 0。

示例项目

你需要实现UIPanGestureRecognizer delegate-gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:方法,以返回YES当手势识别器传递时是你的UICollectionViewpanGestureRecognizer

然后,首先将UICollectionViewscrollEnabled设置为 NO 。一旦你的UICollectionView达到目标高度(根据你的UIPanGestureRecognizer带来的运动),将你的UICollectionView scrollEnabled设置为YES并开始忽略你自己UIPanGestureRecognizer的事件。

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

最新更新