这是一个 UITableView 的子类,具有展开/折叠功能,在很多情况下都非常有用。开发者可以使用具有展开/折叠功能的表格视图代替为每个单元格创建一个详细视图控制器来节省大量时间。因此,每个单元格的详细信息可以直接在同一个表格中显示,而无需切换到另一个视图。
在 Storyboard 或您的 nib 文件中创建一个 UITableView,并将其类更改为 HVTableView。在属性检查器中,您可以设置 expandOnlyOneCell 和 enableAutoScroll 属性。此外,在 storyboard 中将 HVTableViewDelegate 和 HVTableViewDataSource 连接到文件所有者。
expandOnlyOneCell 和 enableAutoScroll 说明
expandOnlyOneCell==TRUE: Just one cell will be expanded at a time.
expandOnlyOneCell==FALSE: multiple cells can be expanded at a time
enableAutoScroll==TRUE: when the user touches a cell, the HVTableView will automatically scroll to it
enableAutoScroll==FALSE: when the user touches a cell, the HVTableView won't scroll.
您的视图控制器必须符合 HVTableViewDelegate 和 HVTableViewDataSource 协议。像 UITableView 一样,您将实现这些熟悉的代理函数
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
我们在 heightForRowAtIndexPath 函数中添加了一个布尔参数,因此您将需要为扩展和折叠状态计算不同的值。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath isExpanded:(BOOL)isExpanded
(isExpanded==TRUE: return the size of the cell in expanded state)
(isExpanded==FALSE: return the size of the cell in collapsed (initial) state)
我们还在 cellForRowAtIndexPath 函数中添加了一个布尔参数。更新单元格的内容,根据其状态(isExpanded)进行更新
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath isExpanded:(BOOL)isExpanded
现在有一些有趣的功能如下。实现 tableView:collapseCell:withIndexPath,当单元格将要展开时将会触发。您可以在这个代理方法中执行绘图、动画等操作
-(void)tableView:(UITableView *)tableView collapseCell: (UITableViewCell*)cell withIndexPath:(NSIndexPath*) indexPath;
对应的功能也在这里。当单元格将要折叠时会触发。您可以在该函数中进行绘图、动画,或者清除单元格
-(void)tableView:(UITableView *)tableView expandCell: (UITableViewCell*)cell withIndexPath:(NSIndexPath*) indexPath;
这些方法添加到了 HVTableView 中
-(void)toggleCellAtIndexPath:(NSIndexPath*)indexPath; // toggles between collapsed and expanded state
-(void)expandCellAtIndexPath:(NSIndexPath*)indexPath; // expands cell if it’s collapsed
-(void)collapseCellAtIndexPath:(NSIndexPath*)indexPath; // collapses the cell if it’s expanded
假设你有一个名为tableView的HVTableView实例。要编程式地展开这个单元格,请使用此方法:
[self.table expandCellAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
对于切换和折叠单元格,用法几乎相同。
如果你正在寻找一个简单易用、易于设置的展开视图库,HVTableView是你的选择。它提供可接受的性能,足以用于常规项目。
展开UITableViewCell需要调用<强国>reloadRowsAtIndexPaths:withRowAnimation:强国>,这会迫使TableView重新加载单元格,之后我们将改变对应单元格的高度。这就是为什么当单元格动画时会出现轻微闪烁的原因,这是由于UITableView的限制而无法避免的。如果你在寻找一个更专业的展开视图,我们建议使用HyperTreeView,它是UIScrollView的一个子类,为节点提供了超平滑的展开/折叠,同时支持分层结构。
要运行示例项目,请克隆仓库,然后首先从示例目录运行pod install
。
HVTableView可以通过CocoaPods获得。要安装它,只需将以下行添加到Podfile中
pod "HVTableView"
HVTableView可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。