【问题标题】:Table View with lockable columns and horizontal scrolling?具有可锁定列和水平滚动的表视图?
【发布时间】:2013-02-28 09:02:36
【问题描述】:

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

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

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

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

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

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

更新

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

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

谢谢

【问题讨论】:

标签: ios uitableview uiscrollview uicollectionview


【解决方案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)];
    }
}

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,我遇到了这个库,虽然它似乎没有对锁定的列进行排序。似乎实现该功能可能需要更多的工作,然后尝试推出自己的功能?
      • @s.newave 您必须推出自己的解决方案来解决这个问题 - 就像使用普通的旧 UITableView 一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      相关资源
      最近更新 更多