水平滚动 UITableView 的奇怪行为(在 Monotouch 中)

Posted

技术标签:

【中文标题】水平滚动 UITableView 的奇怪行为(在 Monotouch 中)【英文标题】:Strange behavior with horizontal scrolling UITableView (in Monotouch) 【发布时间】:2011-11-07 01:23:41 【问题描述】:

我们有一个 UITableView,我们将其配置为像 Grid 一样,允许水平和垂直滚动。我们通过在自定义 UITableView 的 LayoutSubviews 方法中动态更改 ContentSize 来实现这一点,这有助于自动旋转、滚动等。

除了我们的几个较大的网格外,一切都按预期工作。当这些网格水平滚动(向左滑动)时,只要 ContentOffset.X 大于或等于 Bounds.Width,表格视图就会消失。它仍然存在并接收输入,但没有绘制任何内容。向右滑动时,一旦超过宽度阈值,就会重新绘制所有内容。

在网格大小小于配置的 UITableView 宽度的一半的情况下,不会出现此问题。我们无法更改网格的大小,因为它们是由希望数据可用的现场客户配置的。

我已尽可能多地检查和/或删除了我们的自定义绘图代码,但问题仍然存在。有人有什么想法吗?

【问题讨论】:

与 UIScrollView 相比,滥用 UITableView 并实现真正的多列解决方案以满足您的需求有什么优势? 使用 UITableView 的好处主要是单元格的重用。我们的用户在一个 5-20 列的给定列表中可能有数千条记录。如果我们实现了滚动视图,我们必须将表格视图调整为完整大小,以便滚动视图正确滚动,因此必须创建每个单元格。 如果我回想起我在 90 年代后期所做的游戏编程,在我们滚动到底部的每一位上,我们都会在隐藏的顶部创建下一个屏幕行。如果滚动了一个屏幕高度,则重新设置滚动偏移量并且已经填充了下一个屏幕。这在上下滚动时也有效。我认为同样的技术也适用于此。但确实比使用 UITableView 更辛苦。 【参考方案1】:

那是因为虽然 UITableView 继承自 UIScrollView,但它只意味着有一个列,因此它根据它的 Bounds 来绘制它的单元格。

如果你想用 UITableView 创建一个类似网格的控件,我建议在父 UIScrollView 中并排使用多个表视图并更改其 ContentSize。

【讨论】:

因为 UITableView 继承自 UIScrollView,将 SubViews 添加到 UITableView,然后设置 UITableView 的 ContentSize 提供与您建议的完全相同的解决方案,并具有原生 UITableView 单元重用的额外好处,这在大型列表。 你想向 UITableView 添加什么样的子视图?其他表格视图? 因为我们正在模拟一个网格,所以每个子视图在逻辑上都是一列数据,在编程上是一个 UILabel。【参考方案2】:

我遇到了同样的问题,并于 12 月在 Apple 开发者网站上发布了错误报告 (10561166)。

我今天收到了 Apple 的回复,他们说

UITableView 不是为水平滚动而设计或设计的。

(我已经改变了我的设计,不再需要水平滚动。)

【讨论】:

以上是关于水平滚动 UITableView 的奇怪行为(在 Monotouch 中)的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 滚动时奇怪的布局行为变化

带有导航栏大标题的 UITableView 奇怪的滚动行为,顶部的弹跳效果在滚动到顶部时自动切断/生涩

UITableView - reloadRows 方法创建奇怪的滚动错误

UITableView 奇怪的行为

UITableView 方法“indexPathForRowAtPoint:”的奇怪行为

UITableView 的水平移动?