6

我希望创建一个具有以下功能的表:

  • 与表格的其余部分一起水平滚动的可变列数
  • 不随表格其余部分水平滚动的可变数量的可锁定列
  • 可排序的列标题
  • 垂直滚动
  • 水平滚动

我见过人们使用不同的策略来完成类似的功能,包括:

  1. UITableview 每个表格单元格包含一个 UITableview 转换 90 度放置另一个 UIScrollview 内以处理水平滚动。但是,要使其正常工作,我需要为每个单元格使用锁定的旋转表格视图,如果我想滚动整个主表而不是每个表格单元格中的表格,则单元格出队似乎会有些奇怪。
  2. 第一的变体,但对每个表格单元使用自定义 uiview 而不是 uitableview。(目前领先的候选人)
  3. 自定义 UIScrollview 类,它复制 UITableview 的功能并添加了 MDSpreadView 等功能。似乎是最灵活和最难实现的。

有没有人有任何示例/建议/建议来研究哪些内容将相当容易启动和运行、出色的滚动性能和灵活性。

我仍处于计划阶段,试图找出解决此问题的最佳方法,并且到目前为止已经提出了一些想法,其中包括两个具有同步滚动的 uitableviews。左表视图将用于锁定列,右表将用于水平滚动表。两个表都将使用与表格单元相同的 uiviews,每列都有自定义 uiview 对象。

在此处输入图像描述

更新

能够同步锁定列和水平滚动表之间的滚动似乎很简单,到目前为止,这似乎是我倾向于的选项(上面的#2)。有没有人看到这种方法有任何潜在的陷阱或障碍?

在 Roambi 应用程序中可以找到我所追求的所需成品的一个很好的例子(下面的屏幕截图)

在此处输入图像描述

谢谢

4

3 回答 3

1

我已经在我自己的一个应用程序中完成了这项工作 - 看看MDSpreadView。它的委托/数据源调用就像 UITableView 的一样。

于 2013-03-12T22:43:38.757 回答
1

我通过三个视图实现了这一点,通过标准协议和单个视图控制器进行管理。在这个解决方案中,您只关心链接两个表格视图控制器的垂直滚动。水平滚动通过包裹表格视图主体的滚动视图免费提供。我利用以下 UITableViewDelegate 函数来获取锁定的列标题:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;

在此处输入图像描述

查看结构

- View - The VCs root view
  - Table View     - rowHeadersTable                 -  the locked left hand columns
  - Scroll View    - rowBodyHorizontalScrollView     - a container of the table body
    - Table View   - rowBodyVerticalContentTableView - the table body, as wide as it needs to be beyond the frame of the parent scroll view

视图控制器

实现的协议:

@interface LockedTableColumnsViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>

设置:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [self.rowHeadersTable                 setDataSource:self];
    [self.rowHeadersTable                 setDelegate:self];

    [self.rowBodyVerticalContentTableView setDataSource:self];
    [self.rowBodyVerticalContentTableView setDelegate:self];
}

-(void)viewDidAppear:(BOOL)animated
{
    // This ensures the scroll view can only scroll horizontally, and adapts to the size of its member content
    [self.rowBodyHorizontalScrollView setContentSize:self.rowBodyVerticalContentTableView.frame.size]; // Important to do this here rather than viewDidLoad, because we want a final reading on self.rowBodyVerticalContentTableView.frame.size

    [super viewDidAppear:animated];
}

// Do your Table Data Source however you choose

管理 rowHeadersTable 和 rowBodyVerticalContentTableView 之间的垂直滚动链接:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView == self.rowBodyVerticalContentTableView) {
        [self.rowHeadersTable setContentOffset:CGPointMake(self.rowHeadersTable.contentOffset.x, scrollView.contentOffset.y)];
    }
    else if (scrollView == self.rowHeadersTable) {
        [self.rowBodyVerticalContentTableView setContentOffset:CGPointMake(self.rowBodyVerticalContentTableView.contentOffset.x, scrollView.contentOffset.y)];
    }
}

NB 这对于长(意味着高)表会很好地执行,因为它使用原型单元格等。但是它没有针对水平密集的行内容​​进行优化。我的表格正文内容是文本和有限数量的列。如果你没有那么奢侈,你总是可以让你的表格行体成为一个水平流动的集合视图,但是你必须链接你所有的行集合视图偏移量(我猜是通过可见的单元格)。那完全是另一种动物。祝你好运!

于 2013-11-20T23:42:37.713 回答
1

如果您的目标操作系统早于 iOS 6.0,您可以使用此处描述的嵌套表格视图广告。不要忘记同步每个水平表的内容偏移量。

但是如果你的目标是 iOS 6.0+,你可以使用MMSpreadsheetView,但是它的性能很差,你不能为它的列设置不同的大小。

最好的选择是编写自己的 UICollectionView 布局。

于 2013-12-04T16:25:54.530 回答