防止 UITableView 在自定义子视图处理触摸时滚动

Posted

技术标签:

【中文标题】防止 UITableView 在自定义子视图处理触摸时滚动【英文标题】:Prevent UITableView from scrolling when custom subview is handling touches 【发布时间】:2012-09-22 06:58:51 【问题描述】:

在我的 ios 应用程序中有一个 UITableView,它在其中一个单元格中包含一个自定义子视图。该单元格是一个交互式视图,它处理触摸事件(touchesBegan、touchesEnded、touchesMoved)以更新自身。

问题在于,当用户向上或向下“拖动”时,tableView 会捕获这些触摸(尽管我没有将触摸传递到响应者链上),滚动表格并阻止子视图正常工作。只要用户触摸该特定子视图,我就想防止表格滚动。

子视图根本没有对 tableView 的引用。

如何防止表格的滚动行为?


更新

尽管接受了下面的答案,但我最终还是以不同的方式处理了我的情况。我现在在我的自定义视图中处理触摸事件,将它们传递给响应者链(到表格单元格),单元格也处理触摸事件,使用它们来启用/禁用超级视图(表格)上的滚动。

【问题讨论】:

【参考方案1】:

在 UITableView 中关闭“可取消的内容触摸”为我解决了这个问题(在 Scroll View / Touch 下的 UITableView 属性检查器中)。我从这个 SO 问题中得到了这个:Scrolling a UITableView inside a UIScrollView

来自 UIScrollView:canCancelContentTouches 文档:

如果该属性的值为NO,则滚动视图不滚动 内容视图开始跟踪后,无论手指移动如何。

【讨论】:

太棒了,正是我需要的!非常感谢!【参考方案2】:

在这种情况下,我最常用的方法是将信息委托给事件链。设置代表的方式:

subview->cell->table

您可以做的第二件事是通过通知中心发送通知。 Table 将监听任何禁止正常滚动的事件。它是超调的,但它会使您的代码保持一致。

目前我没有更多的想法。

【讨论】:

您能详细说明您的第一个建议吗?在代码中会是什么样子?至少可以说,通知中心 hack 对我来说似乎不是很干净 :)

以上是关于防止 UITableView 在自定义子视图处理触摸时滚动的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式加载自定义子视图,就像它们是单元格一样?

iOS 视图上的自定义子视图有空插座

拖放防止多个项目同时移动

延迟加载 UICollectionViewCell 的自定义子视图

UIStackView 中等宽的自定义子视图

SwiftUI GeometryReader 不会在中心布局自定义子视图