iOS如何实现表格的折叠效果?

来源:互联网 发布:矩阵加一列 秩不变 编辑:程序博客网 时间:2024/05/16 09:33

一、实现原理:就是在点击表格组头视图的时候,如果该表格视图的组展开了,就把改组的行设置为0,如果该组隐藏了,就显示该组的所有行。

效果如下:

二、实现步骤

1、定义一个数据模型用于封装数据

#import <Foundation/Foundation.h>@interface MyData : NSObject{    NSMutableArray *_array;// 每组的数据    BOOL _isShow;// 组的状态,yes显示组,no不显示组    NSString *_name;// 组名}@property (nonatomic,retain) NSMutableArray *array;@property (nonatomic,copy) NSString * name;@property (nonatomic,assign) BOOL isShow;@end

2、添加数据源

- (void)viewDidLoad{    [super viewDidLoad];// Do any additional setup after loading the view.    // 全局的数据源    dataArray = [[NSMutableArray alloc] init];    // 添加数据    for (int i='A'; i<='Z'; i++) {        MyData *myData = [[MyData alloc] init];        myData.name = [NSString stringWithFormat:@"%c",i];        for (int j=0; j<10; j++) {            [myData.array addObject:[NSString stringWithFormat:@"%c-%d",i,j]];        }        [dataArray addObject:myData];    }    myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStylePlain];    myTableView.dataSource = self;    myTableView.delegate = self;    myTableView.rowHeight = 30;    [self.view addSubview:myTableView];}

3.实现表格的代理方法


// 组数- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView{    return [dataArray count];}// 根据状态来判断是否显示该组,隐藏组把组的行数设置为0即可- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    MyData *data = [dataArray objectAtIndex:section];    if ([data isShow]) {        return  [[data array] count];    }else{        return  0;    }}// 添加每行显示的内容- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *cellName = @"Cell";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName ];    if (!cell) {        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellName] autorelease];    }    MyData *data = [dataArray objectAtIndex:indexPath.section];    NSString *str = [[data array] objectAtIndex:indexPath.row];    cell.textLabel.text = str;    return cell;}

4.自定义组的头标题视图,添加点击事件

// 定义头标题的视图,添加点击事件- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{    MyData *data = [dataArray objectAtIndex:section];        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];    btn.frame = CGRectMake(0, 0, 320, 30);    [btn setTitle:data.name forState:UIControlStateNormal];    btn.tag = section;    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];    if (section%2) {        btn.backgroundColor = [UIColor darkGrayColor];    }else{        btn.backgroundColor = [UIColor lightGrayColor];    }    return btn;}- (void) btnClick:(UIButton *)btn{    MyData *data = [dataArray objectAtIndex:btn.tag];    // 改变组的显示状态    if ([data isShow]) {        [data setIsShow:NO];    }else{        [data setIsShow:YES];    }    // 刷新点击的组标题,动画使用卡片    [myTableView reloadSections:[NSIndexSet indexSetWithIndex:btn.tag] withRowAnimation:UITableViewRowAnimationFade];}