博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的可展开和收缩的tableview
阅读量:6429 次
发布时间:2019-06-23

本文共 3350 字,大约阅读时间需要 11 分钟。

写了好多的tableview,只是把常用的tableview的应用场景给大家介绍下,(^__^) 嘻嘻……,话不多说,今天介绍的是一个简单的可以展开和收缩的tableview,类似于qq好友类表。

首先,犹豫是简单的demo,我们就自己构造数据。

for (int i = 0; i < 4; i++) {    BaseDataModel *model = [[BaseDataModel alloc] init];    model.isOpen = NO;    NSString *name = [NSString stringWithFormat:@"Section:%d",i];    model.name = name;    NSMutableArray *array = [NSMutableArray arrayWithCapacity:5];    for (int j = 0; j < 4; j++) {        NSString *cellName = [NSString stringWithFormat:@"Cell:%d",j];        [array addObject:cellName];    }    model.dataArray = array;    [self.dataArray addObject:model];}复制代码

BaseModel是我们的一个model类。OK,当我们的数据构造好了,接下来就是设计我们的tableview里的section-headerview,主要是给headerview添加一个点击事件,之后在我们的mainviewcontroller里响应,这边可以有很多种解决方法(可以delegate,也可以block,也可以通知)。我用的是block,相对来说简单点。tap事件代码如下:

if (_isOpen) {    [UIView animateWithDuration:0.3 animations:^{        _imageView.transform = CGAffineTransformRotate(_imageView.transform, -M_PI / 2);    }];    self.closeblock(self.section);}else{    [UIView animateWithDuration:0.3 animations:^{        _imageView.transform = CGAffineTransformRotate(_imageView.transform, M_PI / 2);    }];    self.openblock(self.section);}self.isOpen = !self.isOpen;复制代码

回到我们的mainviewcontroller里:

HeaderView *headerView = [[HeaderView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, 40)];headerView.nameLabel.text = model.name;headerView.section = section;__weak typeof(self) weakself = self;headerView.openblock =^(NSInteger secion){    [weakself openSection:section];};headerView.closeblock = ^(NSInteger section){    [weakself closeSection:section];};复制代码

展开的方法是:

BaseDataModel *model = self.dataArray[section];model.isOpen = !model.isOpen;NSMutableArray *indexArray = [NSMutableArray arrayWithCapacity:10];for (int i = 0; i < model.dataArray.count; i++) {    NSIndexPath *indexpath = [NSIndexPath indexPathForRow:i inSection:section];    [indexArray addObject:indexpath];}[self.tableView insertRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];复制代码

关闭的方法是:

BaseDataModel *model = self.dataArray[section];model.isOpen = !model.isOpen;NSMutableArray *indexArray = [NSMutableArray arrayWithCapacity:10];for (int i = 0; i < model.dataArray.count; i++) {    NSIndexPath *indexpath = [NSIndexPath indexPathForRow:i inSection:section];    [indexArray addObject:indexpath];}[self.tableView deleteRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];复制代码

由于当你删除或者添加数据的时候,对应的datasource也要做出相应的改变,所以在返回numberOfRowsInSection时:

BaseDataModel *model = self.dataArray[section];if (model.isOpen) {    return model.dataArray.count;}else{    return 0;}复制代码

因为tableView有自己的重用机制,sectionHeaderView也会被重用,所以如果不设置好数据源多的时候会乱掉,在MVC的设计模式里,用于控制View的状态的是model,于是可以将控制状态的参数写入init初始化里:

- (instancetype)initWithFrame:(CGRect)frame IsOpen:(BOOL)isOpen { if (self = [super initWithFrame:frame]) {    self.backgroundColor = [UIColor whiteColor];    [self addSubview:self.nameLabel];    [self addSubview:self.imageView];    [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOpen)]];    self.isOpen = isOpen;    if (self.isOpen) {       _imageView.transform =  CGAffineTransformRotate(_imageView.transform, M_PI / 2);    } } return self;}复制代码

这样的话,一个简单的展开收缩的tableview就完成了。 demo地址:https://github.com/ioscick/Extand-TableView

欢迎各位阅读,希望能帮到各位,如果有不正确的地方也可以一起探讨~ thanks。

转载地址:http://wwiga.baihongyu.com/

你可能感兴趣的文章
RAC维护手记08-ASM磁盘组信息查看常用命令
查看>>
实验08 磁盘和文件系统管理
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
FastDFS整合nginx后,nginx一直报错
查看>>
使用Fuel安装OpenStack juno之三使用OpenStack创建云主机和Volume
查看>>
zabbix安装源
查看>>
Eclipse+kafka集群 实例源码
查看>>
Vijos 1067Warcraft III 守望者的烦恼
查看>>
LinkedList
查看>>
Python number
查看>>
【Lv1-Lesson008】A Guide to Birthdays
查看>>
MySQL_PHP学习笔记_2015.04.19_PHP连接数据库
查看>>
juery 选择器 选择多个元素
查看>>
【新手向】TensorFlow 安装教程:RK3399上运行谷歌人工智能
查看>>
Oracle Net Configuration(监听程序和网络服务配置)
查看>>
c语言_判断例子
查看>>
ubuntu重启不清除 /tmp 设置
查看>>
面向对象
查看>>
JSON
查看>>