iOS UITableview实现展开折叠效果

使用UItableview实现展开折叠效果,话不多说,先看一下运行效果:

iOS UITableview实现展开折叠效果_第1张图片
001.gif
讲一下实现的大概思路:
  1. 自定义每个section的headerView,并且给headerView添加tap手势.
  2. 在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下载点击这里

你可能感兴趣的:(iOS UITableview实现展开折叠效果)