0

我有一个UIViewController包含 a 的 a UIScrollView,它本身包含 aUITableView和 another UIScrollView。嵌套内部UIScrollView是另一个UITableView.

当我计算表格应该ViewDidAppearUIViewController多大(比屏幕大得多)并设置它们的大小,然后设置内容大小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 线程。

4

3 回答 3

1

从文档中:

重要提示:您不应该在 UIScrollView 对象中嵌入 UIWebView 或 UITableView 对象。如果这样做,可能会导致意外行为,因为两个对象的触摸事件可能会混淆并错误处理。

您的界面可能看起来很慢,因为触摸事件被错误的对象处理。这可能会使滚动视图看起来跳来跳去、动作迟缓或根本没有响应。

你能描述一下你想要的行为吗?您能否仅使用带有 UIScrollView 的 UITableView 或 UICollectionView 来实现您想要的?

于 2013-09-16T14:37:48.740 回答
1

您是否尝试过使用自动布局来执行此操作?当视图实际调整大小时,您无需负责,只需在 viewDidLoad 中设置约束,其余部分由系统处理。

但就手动布局而言 - 我不明白为什么会发生这种情况。当您使用 Instruments 对其进行分析时,Time Profiler 中的慢速部分是什么?

于 2013-09-13T18:55:53.963 回答
1

看来,您提议的实现工作的唯一方法是在初始化时加载所有 UI,这完全消除了使用 UITableView 的性能优势。拥有一个正常滚动的顶级 UITableView 并在每个单元格中包含一个水平滚动的 UIScrollview 将大大提高效率(从内存的角度来看)。

+-------------------------Table View---------------------------+
|+-----------------------Table View Cell---------------------+|
||+--Fixed Section--+ +---------Synched Scroll View---------+||
|||                 | |                                     ||| 
|||                 | |                                     |||
||+-----------------+ +-------------------------------------+||
|+-----------------------------------------------------------+|
|+-----------------------Table View Cell---------------------+|
||+--Fixed Section--+ +---------Synched Scroll View---------+||
|||                 | |                                     ||| 
|||                 | |                                     |||
||+-----------------+ +-------------------------------------+||
|+-----------------------------------------------------------+|
|+-----------------------Table View Cell---------------------+|
||+--Fixed Section--+ +---------Synched Scroll View---------+||
|||                 | |                                     ||| 
|||                 | |                                     |||
||+-----------------+ +-------------------------------------+||
|+-----------------------------------------------------------+|
+--------------------------------------------------------------+

重要的一步是同步水平滚动视图,您可以通过在 -scrollViewDidScroll 上发送 NSNotifications 或自定义委托消息来实现:

在表格视图单元格中创建 10 多个滚动视图可能会感觉很浪费,但实际上它最终会相当有效。

于 2013-09-18T17:56:37.380 回答