【问题标题】:make UIGestureRecognizer respond to a gesture that is already in progress and being recognized by another recognizer使 UIGestureRecognizer 响应已经在进行中并被另一个识别器识别的手势
【发布时间】:2013-11-14 02:09:11
【问题描述】:

所以这是交易:

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

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

我想要实现的行为是:

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

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

更新:

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

  1. 默认情况下,滚动视图(和子类)不响应在 scrollEnabled 设置为 YES 时正在进行的手势的问题仍然存在,无论处理 2 个滚动视图或手势识别器和滚动视图。
  2. 我解决了这个问题,方法是对有问题的类进行子类化(在我的示例中,一个表格视图和一个滚动视图)并操纵scrollEnabledproperty 和-setContentOffset:,并将视图的识别器设置为同时识别。至此,我终于可以任意设置滚动视图(或子类)scrollEnabled 并让它们响应正在进行的手势。

但我还面临其他一些问题:

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

sample project

【问题讨论】:

    标签: uiscrollview ios7 uigesturerecognizer


    【解决方案1】:

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

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

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

    【讨论】:

    • 我之前尝试过一种与您提到的同时识别完全相同的设置,但滚动视图不会开始响应手势,直到我结束正在进行的被平移识别器识别的手势。他们的关键区别可能是你说我应该在我自己的识别器中忽略手势。如何忽略手势?或者您所说的“开始忽略来自您自己的 UIPanGestureRecognizer 的事件”是什么意思。 ?
    • 如果滚动视图在您自己的平移手势识别器停止之前没有开始响应手势,那么听起来您没有正确设置同时识别。 “忽略”我的意思是不要对你得到的回调做任何事情。如果设置正确,您仍然会得到它们,滚动视图的手势识别器也会得到它们。
    • 再说一遍:如果可以的话,试试只使用嵌入式滚动视图?
    • 我也尝试过嵌入滚动视图,但不行,因为子滚动视图(在父级之上)总是会先拦截触摸,而不是将它们传递给父级。我还尝试将 UIScrollView 子类化为 1 - 将 gestureRecognizer:shouldRecognizeSimultaneously... 设置为 YES,以便将触摸传递给超级视图并覆盖 -setContentOffset,因此它不会滚动,直到父级将 -scrollEnabled 设置回 YES。这很有效,但是当滚动视图减速到最后一个偏移量时,最后一个偏移量使它跳到一个稍微偏离的位置。
    • 顺便说一句,我不知道我怎么可能设置错误的同时识别:它基本上是从一个方法返回YES。我的观点是,如果您 1 - 在某些跟踪手势的视图中设置 scrollEnabled = NO,2 - 启动另一个识别器开始跟踪的手势,以及 3 - 在手势期间的某个任意点(UIGestureRecognizerStateChanged)切换第一个视图 scrollEnabled = YES ,视图的识别器将不会拾取正在进行的手势。或者至少,UISCrollView 做了一些其他的事情,一旦一个手势正在进行,它会阻止它的识别器再次跟踪它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多