大型UITable研究应用程序停止

时间:2013-09-13 18:43:53

标签: iphone ios xamarin

我的UIViewController包含UIScrollView,其中包含UITableView和另一个UIScrollView。在嵌套的UIScrollView里面是另一个UITableView(有这种疯狂的方法,与我一起裸露)。

当我在ViewDidAppear的{​​{1}}中计算表格的大小(比屏幕大得多)并设置其大小,然后设置UIViewController的内容大小匹配它们包含的表(UIScrollView将提供滚动而不是表本身)。这一切在模拟器中工作正常,但在实际设备上,它会停止处理,将处理器固定在~100%几十秒。这显然是不可接受的。有人知道为什么吗?或者我如何解决它?

代码看起来像这样:

UIScrollView

删除两个表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之后的某个地方。

更新:我有一个顿悟,想到如果重新调整表格是问题,只需使表格足够大,不需要调整大小。在我的设置中,滚动视图由滚动视图而不是表本身处理,因此我可以将表设置为非常大并让滚动视图ViewDidAppear处理剪裁表的空白部分。从某种意义上说,它可以显示我想要它的效果,但它实际上甚至更慢!所以我的结论是,表调整大小不是问题所在,而是存在非常长的(在这种情况下,我将高度设置为4,000 - 调整大小将其设置为2,354)表。

背景:为我正在尝试的内容添加更多内容。由于Apple以他们的智慧决定没有人需要像控制一样的网格,我试图建立一种情况,我有一个网格状的视图,其中最左边的列留在原地,但你可以水平滚动右边 - 大多数列,并且,当您垂直滚动时,一切都将保持同步。经过一番搜索,我遇到了一个解决方案(抱歉,记不清楚到底在哪里),这有点调整工作(在模拟器中)。基本上,您在滚动视图中嵌入表,以便滚动视图可以处理滚动。布局看起来像这样:

ContentSize

固定表有一个带有几列的自定义单元格,而滚动表有另一个自定义单元格(比屏幕宽)和其余列。您可以水平滚动滚动表(由于内部滚动视图),您可以通过外部滚动视图垂直滚动所有内容。

另一个更新:所以看起来问题是桌子在你设置它时不重复使用单元格。我想单元重用逻辑只扩展到确定单元格是否在表格的框架内,而不是表格的那部分是否实际可见。因此,有50个项目,而不是显示6-7然后重新使用这些单元格,它创建所有50个无论如何。所以我放弃了我之前的尝试,并试图在两个表之间同步滚动:

 +-------------------------Outer Scroll-------------------------+
 |                  +---------------Inner Scroll---------------+|
 |+--Fixed Table--+ |+---------Scrolling Table----------------+||
 ||               | ||                                        ||| 
 ||               | ||                                        |||
 ||               | ||                                        |||
 ||               | ||                                        |||
 ||               | ||                                        |||
 ||               | ||                                        |||
 |+---------------+ |+----------------------------------------+||
 |                  +------------------------------------------+|
 +--------------------------------------------------------------+

这几乎可以工作,除了iOS不喜欢表格的水平滚动,所以内部表格仍然需要包含在滚动视图中(使用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); }; 设置以覆盖我需要滚动的宽度)。此时几乎有效。它通常会保持同步,但是如果有一些混乱,你可以得到,例如,内部表格对角滚动(尽管设置方向锁定每个人),在某些情况下,它可能会使它们失去同步,这看起来真的很愚蠢。所以它在视觉上并没有那么好用,但至少它并没有把UI线程挂得很糟糕。

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用自动布局?在那里你不负责实际调整视图的大小,只需在viewDidLoad中设置约束,然后由系统处理其余部分。

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

答案 1 :(得分:1)

来自文档:

  

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

由于触摸事件由错误的对象处理,因此您的界面可能显得很慢。这可能会使滚动视图出现跳跃,行为滞后或根本不响应。

你能说出你想要的行为吗?只使用带有UIScrollView的UITableView,或者可能是UICollectionView,你能实现你想要的吗?

答案 2 :(得分: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多个滚动视图可能感觉浪费,但实际上它最终效率很高。