带有Section的可折叠UITableView

时间:2015-12-27 10:25:35

标签: ios objective-c uitableview collapse expandable-table

我希望实现一个功能,我需要在uitableview中折叠并展开一些视图。

我已经通过一种方法,我可以制作部分,然后单击部分我显示或隐藏这些部分的单元格。

我的问题还有一个视图,它不应该在行的第一部分上方可以匹配。我有点混淆在这种情况下应该是什么样的正确解决方案。

场景非常复杂,所以我画了一些草图以保持简单。

请告诉我正确的解决方案或示例。

enter image description here

3 个答案:

答案 0 :(得分:0)

因此,如果我理解正确,您会更喜欢使用tableViewCells,其中tableviewcell的某些部分可以在一些用户操作之后展开(可能在按下同一单元格中的一个按钮之后)? 那么你可以考虑的是在你的表视图单元格中有一个这样的方法

- (IBAction)action:(id)sender {
[_delegate actionPressed:relevantData];

}

将操作连接到适当的按钮。 然后在tableviewcontroller中实现该方法

-(void)actionPressed:(id)relevantData
{
//update your datasource, for example retrieve the text you want in your expanded views
[self.tableView reloadData];
}

方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//normal things about reusing cells etc.
[cell configureWithData:(id)Data];

return cell;
}

在自定义表格单元格中实现configureWithData。根据要配置单元格的数据(可能取决于是否按下了某些按钮),您可以设置单元格,但是某些视图是否已展开。

确保在

中考虑到这一点
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
//return correct cell height depending on which views in cell were expanded or not

}

或者您可以使用autolayout连接您的单元格,并在viewdidload中使用类似的内容

self.tableView.estimatedRowHeight=100.0;
self.tableView.rowHeight=UITableViewAutomaticDimension;

答案 1 :(得分:0)

您可以按照完成下拉单元格的方式保留它,并使用将放在整个tableview顶部的tableview标题视图(不是节标题)。您可以将uiview拖到storyboard中的tableview顶部,也可以在viewDidLoad中以编程方式拖动:

 UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
 UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
 [headerView addSubview:imageView];
 UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
 [headerView addSubview:labelView];
 self.tableView.tableHeaderView = headerView;

它看起来像这样(这是集合视图,所以单元格显然是全宽)。有一个全局标题,然后是你的节标题,然后是你的单元格:

enter image description here

答案 2 :(得分:0)

几周前我解决了同样类型的问题,你可以试试这个 -

首先使用自定义单元格并使用自动布局,以便单元格自行调整大小 即根据其内容确定其大小,您可以从此链接http://useyourloaf.com/blog/self-sizing-table-view-cells.html

获取帮助

(如果要添加代码,添加这些约束会更容易)

基本思想是分别为扩展状态和收缩状态添加约束并将它们存储在数组中。

扩展状态 - 正常状态,如图所示。添加所需的约束并将它们存储在数组中,如 constraintsForExpansionOfView

合同状态 - 在此状态下,所有视图都将存在,但所有合同的视图将移动到单元格的顶部,而alpha = 0即合同视图将被隐藏,但会在顶部,并且不会干扰确定细胞大小。 为合同规定状态添加这些约束时,使用

停用它们
constraint.active = false

还将这些约束存储在单独的数组中,例如 constraintsForContractionOfView

所以,最初你的 constraintsForExpansion 会被应用,因为我们在添加时没有停用它们。

最后一步 - 当你想要在动画块下查看合同时,有一段时间写下面的代码 -

        for constraint in constraintsForContractionOfView {

            constraint.active = true
        }


        for constraint in constraintsForExpansionOfView {

            constraint.active = false
        }

在动画块下,还要将要收缩的视图的Alpha更改为0,如

someview.alpha = 0

同时再次扩展视图只是在动画块中执行相反的操作,即现在激活 constraintsForExpansionOfView 并停用 constraintsForContractionOfView 并将所有隐藏视图的alpha更改为1.