2013-03-12 102 views
6

我期待创建具有以下特征的表:带有可锁定列和水平滚动的表视图?

  • ,随着 表中的其余横向滚动列数量可变
  • 变量数列可锁定的不水平滚动 与表的其余部分
  • 可排序列标题
  • 卷轴垂直
  • 卷轴水平

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

  1. 的UITableView与含有放置内的另一个的UIScrollView来处理水平滚动的一个UITableView 变换90度的每个表格单元。为了这个工作,但我需要为每个单元格使用锁定的旋转表格,如果我想要滚动整个主表格而不是每个表格单元格中的表格,好像会出现一些单元出毛病。
  2. 第一个变体,但对每个表格单元使用自定义uiview而不是uitableview。 (到目前为止的主要候选人)
  3. 自定义UIScrollview类,它复制了 UITableview的功能,并添加了诸如MDSpreadView之类的功能。看起来像最灵活和最难实施的。

有没有人有什么样的例子/建议/建议可以很容易地启动和运行,很好的滚动性能和灵活性。

我仍处于规划阶段,试图找出解决这个问题的最佳方法,并提出了一些构思,其中包含两个同步滚动的可视化视图。左表视图将用于锁定列,右表将用于水平滚动表。两个表都会使用与每个列具有自定义uiview对象的表格单元格相同的uiviews。

enter image description here

UPDATE

似乎很直截了当地能够同步锁定列和水平滚动表,到目前为止,这似乎是我正在朝着扶着选项间滚动( #2)。有没有人用这种方法看到任何潜在的陷阱或障碍?

所需的成品我是可以在应用程序的Roambi发现后的一个很好的例子(下图)

enter image description here

THX

+0

我们已将所有这些功能内置到我们的产品中:http://www.ioscomponents.com/Home/IOSDataGrid – 2014-08-31 23:53:29

回答

1

我在我自己的一个这样做应用程序 - 看看MDSpreadView。它的委托/数据源调用就像UITableView的调用一样。

+0

是的,我遇到了这个库,虽然它似乎没有排序锁定的列。似乎可能需要更多的工作来实现该功能,然后试图推出自己的? – 2013-03-14 15:23:33

+0

@ s.newave您必须将自己的解决方案推出该问题 - 就像使用普通的旧UITableView一样。 – Undo 2013-03-14 15:29:37

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.由于它使用了原型单元格等,因此这对长时间(意思是高的)表格来说会表现的很好。但是它并不针对水平激烈的行内容进行优化。我的表格内容是文本,列数有限。如果你没有这种奢侈品,你总是可以使你的表格行身为水平流动的集合视图,但是你必须链接所有的行集合视图偏移量(通过我猜测的可见单元格)。那是另外一种动物。祝你好运!

1

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

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

您拥有的最佳选择是编写您自己的UICollectionView布局。