具有可锁定列和水平滚动的表视图?

时间:2013-03-12 17:36:04

标签: ios uitableview uiscrollview uicollectionview

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

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

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

  1. UITableview,每个表格单元格包含一个UITableview 转换90度放置另一个UIScrollview的内部来处理水平滚动。为了实现这一点,我需要为每个单元格使用锁定的旋转tableviews,如果我想滚动整个主表而不是每个表格单元格中的表格,似乎会出现一些带有单元格dequeing的funkiness。
  2. 第一种变体,但每个表格单元使用自定义uiview而不是uitableview。 (到目前为止的主要候选人)
  3. 自定义UIScrollview类,它复制了a的功能 UITableview增加了MDSpreadView等功能。似乎是最灵活,最难实施的。
  4. 有没有人有任何关于应该注意什么的示例/建议/建议,这些示例/建议/建议相当容易启动和运行,滚动性能好,而且灵活。

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

    enter image description here

    更新

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

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

    enter image description here

    THX

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

enter image description here

查看结构

- 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)];
    }
}

N.B。这对于长(意味着很高)的表来说表现很好,因为它利用原型单元等。但是它并没有针对水平强烈的行内容进行优化。我的表体内容是文本和有限数量的列。如果你不具备这种奢侈品,你总是可以使你的桌子行体成为一个水平流动的集合视图,但是你必须链接你所有的行集合视图偏移(我想通过可见的单元格)。这是另一种动物。祝你好运!

答案 2 :(得分:1)

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

但如果您定位到iOS 6.0+,则可以使用MMSpreadsheetView,但其性能非常差,并且不允许为其列设置不同的大小。

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