使用UItableview实现展开折叠效果,话不多说,先看一下运行效果:
讲一下实现的大概思路:
- 自定义每个section的headerView,并且给headerView添加tap手势.
- 在tap触发的方法中判断当前点击的section状态,然后调用*- (void)reloadSections:(NSIndexSet )sections withRowAnimation:方法刷新section.
几个关键的地方:
1.在点击section的时候,需要判断当前点击的section的状态是展开还是关闭.我用的方法是创建了一个NSMutableArray,在这个数组中添加和section的count相同的元素,这里我存放的就是0和1的字符串,0代表关闭,1代表展开,代码如下:
for (NSInteger i = 0; i < _provinceArray.count; i++) {
[_isExpandArray addObject:@"0"];//0:没展开 1:展开
}
如果你有更好的方法,可以留言告诉我一下,谢谢~
2.在numberOfRowsInSection这个方法中,需要根据标识,来决定每个section中row的个数,记住,千万不要写死了.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if ([_isExpandArray[section]isEqualToString:@"1"]) {
NSString *keyProvince = _provinceArray[section];
NSArray *cityArray = [_provinceDic objectForKey:keyProvince];
return cityArray.count;
}else{
return 0;
}
}
3.最后一个比较关键的点就是tap手势所触发的方法,这个方法主要做两件事:首先要判断section的状态,更改小三角形的图标;然后调用reloadSections刷新section:
- (void)tapAction:(UITapGestureRecognizer *)tap{
if ([_isExpandArray[tap.view.tag] isEqualToString:@"0"]) {
//关闭 => 展开
[_isExpandArray removeObjectAtIndex:tap.view.tag];
[_isExpandArray insertObject:@"1" atIndex:tap.view.tag];
}else{
//展开 => 关闭
[_isExpandArray removeObjectAtIndex:tap.view.tag];
[_isExpandArray insertObject:@"0" atIndex:tap.view.tag];
}
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:tap.view.tag];
NSRange rang = NSMakeRange(indexPath.section, 1);
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:rang];
[_provinceTableView reloadSections:set withRowAnimation:UITableViewRowAnimationFade];
}
通过这几步就能实现展开收起的效果了.demo下载点击这里