嵌套的UITableViews:一种只滚动外部UITableView的方法,同时禁用内部?

时间:2015-01-03 07:41:24

标签: ios uitableview uiscrollview uigesturerecognizer uipangesturerecognizer

我有一个UITableView,其中一些(不是全部)UITableViewCell包含他们自己的UITableView。

我发现的默认行为是,当尝试单击滚动(UIScrollViewPanGestureRecognizer)最外面的表时,滚动工作得很好,但只有当点击开始于不包含嵌套UITableView的单元格时。当单元格确实包含嵌套的UITableView时,将调用该内部表的PanGestureRecognizer。这种行为是可以理解和预期的。

我希望禁用内部表格上的所有滚动,有任何从它们开始的平移手势,而不是在外部表格上触发/调用滚动。

我已经研究并尝试了几种解决方案,但没有成功。

禁用嵌套单元格中的所有交互不是一个选项,因为我需要能够在嵌套表格中点击选择或滑动删除单元格。

我能够找到并删除内部表的UIScrollViewPanGestureRecognizer。这成功禁用了内部表的滚动。但是,我无法调用外部表的UIScrollViewPangestureRecognizer。相反,我的外表基本上有“死点”(具有嵌套表格的单元格),不会在外表上滚动。

我读过的有关视图层次结构和命中测试的所有内容都表明上述解决方案应该可以正常工作:UITouch包含在UIEvent中,因此查询视图层次结构中所有可能的接收器。奇怪的是,从调试器开始,我的视图层次结构似乎在内部UITableView的位置处被切断。也就是说,对于所讨论的UITableViewCell,其超级视图链仅导致nil,而不是最外层的表。然而,使用Reveal App(www.revealapp.com),我已经确认我的视图层次结构确实是连接的(这是有意义的,否则内部表将不会呈现)。

最后,我尝试了这段代码:

[innerTable.panGestureRecognizer requireGestureRecognizerToFail:outerTable.panGestureRecognizer];

根据我的推荐,这应该完全符合我在这里寻求的内容 - 除非外表推迟,否则内表不会捕获泛手势。但是这段代码没有效果。

您可以提供的任何帮助都非常感激 - 这已成为令人困惑的用户界面神秘感很多天了!

3 个答案:

答案 0 :(得分:1)

只需在内部表中将滚动设置为禁用,并将表的内容大小设置为等于总大小。然后将该表添加到外部表中,让它执行所有滚动操作。 UITableViewUIScrollView的子类,因此请查看scrollview方法,以帮助您将tableview配置为在另一个中工作。

答案 1 :(得分:1)

  

我希望禁用内部表格上的所有滚动

要么大量光顾,要么你自己踢,但你没有在问题中提到它,所以你试过这个:

innerTableView.scrollEnabled = NO;

如果这不起作用,您可能需要将视图控制器设置为来自两个(所有)表视图的平移识别器手势的委托,并为shouldRecognizeSimultaneouslyWithGestureRecognizer:返回YES

答案 2 :(得分:0)

您可以为内表的panGestureRecognizer设置minimumNumberOfTouches为2。通过这个内部表将仅在两个手指上滚动(如果此UX是可接受的。)。