带部分的可折叠 UITableView
Posted
技术标签:
【中文标题】带部分的可折叠 UITableView【英文标题】:Collapsable UITableView with Section 【发布时间】:2016-04-01 11:26:05 【问题描述】:我想实现一种功能,我需要在 uitableview 中折叠和展开一些视图。
我已经采用了一种方法,在该方法中,我可以制作部分,然后单击部分我会显示或隐藏该部分的单元格。
我的问题是有一个视图,不应该在连续第一部分的上方折叠。我有点困惑,在这种情况下什么应该是正确的解决方案。
场景非常复杂,所以我画了一些草图以保持简单。
请让我知道实现此目的的正确解决方案或示例。
【问题讨论】:
【参考方案1】:因此,如果我理解正确,您更愿意使用 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
或者你可以用自动布局连接你的单元格并在 viewdidload 中使用类似的东西
self.tableView.estimatedRowHeight=100.0;
self.tableView.rowHeight=UITableViewAutomaticDimension;
【讨论】:
【参考方案2】:几周前我解决了同样类型的问题,你可以试试这个 -
首先有自定义单元格并使用自动布局,以便单元格自行调整大小 即根据其内容确定其大小,您可以通过此链接获取帮助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。
【讨论】:
【参考方案3】:您可以按照完成下拉单元格的方式保留它,并使用将放在整个 tableview 顶部的 tableview 标题视图(不是节标题)。您可以将 uiview 拖到情节提要中的 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;
它看起来像这样(虽然这是一个集合视图,所以单元格显然是全宽的)。有一个全局标题,然后是您的部分标题,然后是您的单元格:
【讨论】:
以上是关于带部分的可折叠 UITableView的主要内容,如果未能解决你的问题,请参考以下文章