我的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线程挂得很糟糕。
答案 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多个滚动视图可能感觉浪费,但实际上它最终效率很高。