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

Posted

技术标签:

【中文标题】嵌套的 UITableViews:一种只滚动外部 UITableView,同时禁用内部的方法?【英文标题】:Nested UITableViews: a way to scroll only the outer UITableView, while disabling the inner? 【发布时间】:2015-01-03 07:41:23 【问题描述】:

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

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

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

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

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

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

我所读到的关于视图层次结构和命中测试的所有内容都表明,上述解决方案应该可以简单地工作:UITouch 被包装在 UIEvent 中,因此会查询视图层次结构中所有可能的接收者。奇怪的是,从调试器来看,我的视图层次结构似乎在内部 UITableView 处被切断。也就是说,对于有问题的 UITableViewCell,它的 superview 链只导致 nil,而不是最外层表。然而,使用 Reveal 应用程序 (www.revealapp.com),我已经确认我的视图层次结构确实是连接的(这是有道理的,否则内部表格将不会呈现)。

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

[innerTable.panGestureRecognizer requireGestureRecognizerToFail:outerTable.panGestureRecognizer];

根据我的参考,这应该完全符合我在这里的要求——除非外部表延迟,否则内部表不会捕获平移手势。但是这段代码没有任何作用。

非常感谢您提供的任何帮助 - 这已经是一个令人困惑的 UI 谜团很多天了!

【问题讨论】:

什么时候用户能够滚动内部表格视图?还是已经计算出完全可见? 计算为完全可见。 【参考方案1】:

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

【讨论】:

【参考方案2】:

我的愿望是禁用内表上的所有滚动

这要么是大张旗鼓,要么你会踢自己,但你没有在问题中提到它,所以你试过这个:

innerTableView.scrollEnabled = NO;

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

【讨论】:

这可行,但您还需要设置内容大小,否则您将永远无法看到其余部分,或者您必须手动设置内表滚动时的内容偏移量跨度> 我假设这已经完成并且单元格足够大以显示完整的内表 一点也不光顾(我是 ios 新手,刚入职六周)。我不知道scrollEnabled。但是刚才试了一下,没有效果。 (一开始我以为是,但我错了) 好的,另一种选择。请确保您已撤消到目前为止的所有其他尝试,以防止出现奇怪的副作用。 @shaunlim 是的,但在大多数情况下,我希望内表非常小,否则从代码或用户体验的角度来看,这不是一个好的设计。【参考方案3】:

您可以将内表的 panGestureRecognizer 的 minimumNumberOfTouches 设置为 2。通过这个内表将只用两个手指拖动滚动(如果这个 UX 是可以接受的。)。

【讨论】:

感谢您的建议。不幸的是,用户体验不可接受

以上是关于嵌套的 UITableViews:一种只滚动外部 UITableView,同时禁用内部的方法?的主要内容,如果未能解决你的问题,请参考以下文章

UITableViews 水平滚动视图中的额外空白

在单个 UIScrollview 中使用多个 UITableViews,如何仅加载可见单元格的单元格数据

iOS - 具有多个 UITableViews 的水平 UIScrollView

嵌套滚动视图的滚动无法正常工作

ScrollView,ListView等带滚动条控件嵌套解决方案汇总

ScrollView,ListView等带滚动条控件嵌套解决方案汇总