我有一个UIViewController
包含 a 的 a UIScrollView
,它本身包含 aUITableView
和 another UIScrollView
。嵌套内部UIScrollView
是另一个UITableView
.
当我计算表格应该ViewDidAppear
有UIViewController
多大(比屏幕大得多)并设置它们的大小,然后设置内容大小UIScrollView
以匹配它们包含的表格(UIScrollView
将提供滚动而不是表格本身) . 这一切在模拟器中运行良好,但在实际设备上,它会停止运行,将处理器固定在 ~100% 的状态下持续数十秒。这显然是不可接受的。有人知道为什么吗?或者我该如何解决它?
代码看起来像这样:
OuterScrollView.ContentSize = new SizeF (View.Frame.Width, tableHeight);
InnerScrollView.ContentSize = new SizeF (InnerTable.Frame.Width, tableHeight);
InnerScrollView.Frame = new RectangleF(InnerScrollView.Frame.Location,
new SizeF(InnerScrollView.Frame.Width, tableHeight));
// So far so good
OuterTable.Frame = new RectangleF(OuterTable.Frame.Location,
new SizeF(OuterTable.Frame.Width, tableHeight)); // this slows everything down!!
InnerTable.Frame = new RectangleF(InnerTable.Frame.Location,
new SizeF(InnerTable.Frame.Width, tableHeight)); // and so does this
删除两个表.Frame
设置语句和所有内容都足够快,但是使用它们非常慢。并且缓慢不会直接出现在这里,而是在调用 base 之后的某个地方ViewDidAppear
。
更新:我顿悟了,如果调整表格的大小是问题所在,只需让表格足够大以至于不需要调整大小。在我的设置中,滚动是由滚动视图而不是表格本身处理的,所以我可以将表格设置为非常大,让滚动视图ContentSize
负责剪切表格的空白部分。这有效,因为它显示了我想要的方式,但实际上它更慢!所以我的结论是,问题不是表格调整大小,而是存在很长的表格(在这种情况下,我将高度设置为 4,000 - 调整大小将其设置为 2,354)表格。
背景:为我正在尝试做的事情添加更多内容。由于 Apple 以他们的智慧认为没有人需要类似网格的控件,因此我正在尝试设置一种情况,即我有一个类似网格的视图,其中最左侧的列保持在原位,但您可以水平滚动右侧 -大多数列,并且当您垂直滚动时,所有内容都将保持同步。经过一番搜索,我遇到了一个解决方案(对不起,不记得确切的位置),它经过一些调整(在模拟器中)。基本上,您将表格嵌入到滚动视图中,以便滚动视图可以处理滚动。布局看起来像这样:
+-------------------------Outer Scroll-------------------------+
| +---------------Inner Scroll---------------+|
|+--Fixed Table--+ |+---------Scrolling Table----------------+||
|| | || |||
|| | || |||
|| | || |||
|| | || |||
|| | || |||
|| | || |||
|+---------------+ |+----------------------------------------+||
| +------------------------------------------+|
+--------------------------------------------------------------+
固定表格有一个带有几列的自定义单元格,而滚动表格有另一个带有其余列的自定义单元格(比屏幕宽)。您可以水平滚动滚动表(感谢内部滚动视图),并且您可以垂直滚动所有内容,这要归功于外部滚动视图。
另一个更新:所以问题似乎是当你将表格设置为大时,表格没有重用单元格。我猜单元格重用逻辑仅扩展到确定单元格是否在表格的框架内,而不是表格的该部分是否实际可见。因此,使用 50 个项目,而不是显示 6-7 然后重新使用这些单元格,它会创建所有 50 个项目。所以我放弃了我之前的尝试,并尝试像这样在两个表之间同步滚动:
OuterTable.Scrolled += (sender, arg) =>
{
InnerTable.ContentOffset = new PointF(InnerTable.ContentOffset.X,
OuterTable.ContentOffset.Y);
};
InnerTable.Scrolled += (sender, arg) =>
{
OuterTable.ContentOffset = new PointF(0, InnerTable.ContentOffset.Y);
};
这几乎可以工作,除了 iOS 不喜欢表格的水平滚动,所以内部表格仍然需要包裹在滚动视图中(设置ContentSize
为覆盖我需要滚动的宽度)。在这一点上,它几乎可以工作。它通常会无缝地保持同步,但是稍微弄乱一下你就可以得到,例如,内表对角滚动(尽管对每个人都设置了方向锁定),并且在某些情况下可能会使它们不同步,这看起来真的很愚蠢。所以它在视觉上并不能很好地工作,但至少它不会那么糟糕地挂起 UI 线程。