我希望创建一个具有以下功能的表:
我见过人们使用不同的策略来完成类似的功能,包括:
有没有人有任何关于应该注意什么的示例/建议/建议,这些示例/建议/建议相当容易启动和运行,滚动性能好,而且灵活。
我仍然处于计划阶段,试图找出最好的方法来解决这个问题并且已经提出了一些想法,其中包括两个同步滚动的uitableviews。左表视图将用于锁定列,右表将用于水平滚动表。两个表都将使用与每个列的自定义uiview对象相同的uiviews表。
更新
能够同步锁定列和水平滚动表之间的滚动似乎非常简单,到目前为止,这似乎是我倾向于的选项(上面的#2)。有没有人看到这种方法有任何潜在的陷阱或障碍?
我所追求的所需成品的一个很好的例子可以在Roambi App中找到(下面的屏幕截图)
THX
答案 0 :(得分:1)
我已经在自己的应用程序中完成了这项工作 - 请查看MDSpreadView。它的委托/数据源调用就像UITableView一样。
答案 1 :(得分: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)];
}
}
N.B。这对于长(意味着很高)的表来说表现很好,因为它利用原型单元等。但是它并没有针对水平强烈的行内容进行优化。我的表体内容是文本和有限数量的列。如果你不具备这种奢侈品,你总是可以使你的桌子行体成为一个水平流动的集合视图,但是你必须链接你所有的行集合视图偏移(我想通过可见的单元格)。这是另一种动物。祝你好运!
答案 2 :(得分:1)
如果目标操作系统早于iOS 6.0,则可以使用here所述的嵌套表格视图。不要忘记同步每个水平表的内容偏移量。
但如果您定位到iOS 6.0+,则可以使用MMSpreadsheetView,但其性能非常差,并且不允许为其列设置不同的大小。
您最好的选择是编写自己的UICollectionView布局。