快速,2维表视图

时间:2009-10-16 09:38:14

标签: iphone cocoa-touch core-animation quartz-graphics

我正在实现一个用2轴显示表格信息的视图,但是我开始遇到渲染所有单元格的性能问题。

视图看起来像这样:

+------------+-------------+------------+------------+------------+
|            |   12.00am   |   1.00am   |   2.00am   |   3.00am   |
+------------+---------+---+---+--------+--------+---+-+---+------+
| Category 1 |    x    |   x   |        x        |  x  | x |      |
+------------+---------+-------+-----+-----------+-----+---+------+
| Category 2 |         |      x      |             x              |
+------------+---------+-------+----+--+--------------------------+
| Category 3 |  |       x       |   x   |            x            |
+------------+--+---------------+-------+-------------------------+

每个x标记单元格的中心,或者标记在时间轴上的类别中的一段数据。单元格将包含单个文本标签。当按下细胞时,我需要知道按下了细胞。 x轴将包含24个标记,并且将在5和5之间的任何位置。 30行数据。

目前,我已使用3个主UIScrollViews实现了它;一个在顶部,一个在侧面,然后是一个大的所有细胞。滚动大滚动视图时,它会更新顶部和侧面滚动视图的contentOffsets。这看起来效果很好,而且非常直观。

大型scrollView有许多行视图,与左侧边栏中的标题对齐。然后将单元格插入它们各自的行视图中,并在x轴上移动以相对于时间标记对齐。数据单元不一定与x轴的每小时时间增量精确对齐。

我遇到了两个问题:

  1. 看起来真的很慢。在其中一些表格中,最多可以有2500个单元格。这意味着我可能需要某种视图重用策略。
  2. 当两个单元格彼此相邻时,有一个2px边框,但当它自己的单个单元格有1px边框时(每行的CALayer和单元格视图都有1px边框绘制)。
  3. 第一个问题的一些可能的天真解决方案:

    1. 为数据单元创建一个大视图,将其放入主UIScrollView并使用Quartz绘制所有内容(可能在后台线程中)。
    2. 实施视图重用策略,并在用户快速滚动时处理空白区域。
    3. 有没有人对解决此问题的最佳方法有任何高级别的意见?我以前没有处理过大量的数据/视图,所以任何输入都会非常感激。

1 个答案:

答案 0 :(得分:5)

我创建了一个名为DTGridView的东西(作为DTKit的一部分提供),用于这个目的(这是一个应用程序的电子编程指南)。因此,它允许不同的单元格宽度,如图中所示。

DTGridView使用一个单独的UIScrollView并计算所需的位置。它还实现了单元重用(与UITableView相同)。事实上,如果您知道如何使用表视图,那么DTGridView非常相似;它使用dataSource来收集数据和视图,并提供委托方法(使用gridDelegate属性)来通知某些事件。

DTKit包含一个示例项目,可帮助您了解如何设置网格。

如果您需要任何帮助,请给我一个喊叫。我理解整个套件需要一些更好的记录。 :)