【发布时间】:2013-11-14 02:09:11
【问题描述】:
所以这是交易:
- 我有一个带有集合视图(子视图)的视图,其内容是 高于其边界的高度。所以集合视图将允许 垂直滚动以查看其所有项目。
- 此外,此集合视图位于 aprox。超过其超级视图底部(vc主视图)的一半高度。也就是说,一半的集合视图“隐藏”在屏幕底部之外。
- 我正在使用 UIKit Dynamics 允许上下拖动集合视图。它的静止位置如 2 中所述。它的“展开”位置一直到 vc 的导航栏。
为了触发动态,我在主 vc 视图(集合视图的超级视图)上附加了一个 UIPanGestureRecognizer,如果它检测到在集合视图所在的位置开始拖动,它会启动动态过程以将其拉起或下来。
我想要实现的行为是:
- 如果集合视图已折叠(底部),拖动应通过动态将其向上拉,但不允许集合视图的平移识别器使其同时滚动。
- 一旦我达到了向上拉集合视图的目标高度,集合视图也应该开始响应我的手势,在集合视图内沿垂直方向滚动。这种对集合视图的切换也响应手势需要是连续的。也就是说,如果我根据其在超级视图中的位置设置集合视图的
scrollEnabled,这将不起作用:手势已经在处理中,因此集合视图在我结束当前手势并开始新手势之前不会开始滚动.
那么有没有办法让集合视图中的手势识别器知道一个手势正在进行中,并让它开始识别那个手势,即使它已经被超级视图识别器处理了?
更新:
在这一点上,我什至会选择使用两个嵌套滚动视图的解决方案。 如果有人有兴趣,我尝试了一个小项目。还远远不能接受。 以下是嵌套滚动视图方法的主要问题:
- 默认情况下,滚动视图(和子类)不响应在
scrollEnabled设置为 YES 时正在进行的手势的问题仍然存在,无论处理 2 个滚动视图或手势识别器和滚动视图。 - 我解决了这个问题,方法是对有问题的类进行子类化(在我的示例中,一个表格视图和一个滚动视图)并操纵
scrollEnabledproperty 和-setContentOffset:,并将视图的识别器设置为同时识别。至此,我终于可以任意设置滚动视图(或子类)scrollEnabled并让它们响应正在进行的手势。
但我还面临其他一些问题:
- 根据在我将视图的
scrollEnabled设置为YES 之前手势是否已经持续了一段时间,视图开始接收消息以将其内容偏移设置为不正确的值。也就是说,如果在父滚动视图达到其最大内容偏移量之前禁用 tableview 滚动,则在手势仍在进行时打开 tableview 以响应手势会导致它尝试滚动到父视图的 contentOffset 而不是从 0 开始的下一步值(因为直到此时它的内容偏移量实际上是 0)。 - 根据手势是连续向上平移超过父滚动视图的最大偏移量,然后再次向下滑动,还是 2 次离散滑动(一次向上,一次向下),我也会得到不同的偏移量结果。
- 当将 tableview 拉到其内容偏移量应为
【问题讨论】:
标签: uiscrollview ios7 uigesturerecognizer