iOS开发, 折叠cell, 单行或多行方法

QQ好友列表有个很神奇的效果, 可以折叠和拉伸, 看上去很绚丽,开发中有时候我们也需要用到折叠菜单,今天就来分享一下折叠菜单的使用吧.

基本内容:
1.单行互斥折叠,既打开一行, 其他行随之关闭.
2.多行自由折叠,既每一行都可以自由代开和关闭.

基本思路:利用UITableView加载视图的基本原理和顺序,来控制每个区返回多少行.(或者通过控制每行返回的高度, 其实都是一样的, 只不过一定要注意cell上的子视图超出cell视图的情况,记得裁掉或者透明就好了,当然你要是使用每个区返回的行数来控制, 这个问题就不存在了).

UITableView的执行顺序:
1.它会调用代理方法确定有几行
[TableViewController numberOfSectionsInTableView:]
2.确定每行的表头高和表尾高(如果设定了HeardView和FooterView)
[TableViewController tableView:heightForHeaderInSection:]
[TableViewController tableView:heightForFooterInSection:]
3.确定每行有多少的cell
[TableViewController tableView:numberOfRowsInSection:]
4.然后确定每行cell的高度
[TableViewController tableView:heightForRowAtIndexPath:]
-------------如果设置多行及重复执行以上方法-----------
5.以上信息确定完毕后及调用代理方法去获取cell
[TableViewController tableView:cellForRowAtIndexPath:]
6.返回cell的高度
[TableViewController tableView:heightForRowAtIndexPath:]
7.cell将要显示到屏幕上
[TableViewController tableView:willDisplayCell:forRowAtIndexPath:]
8.cell超出屏幕进行服用时及会调用两次
[TableViewController tableView:heightForRowAtIndexPath:]
然后在进行调用 5 . 6. 7 方法

了解了UITableView的执行顺序, 我们来思考一下cell折叠的大概流程, 通常都是点击某个分组, 然后出发折叠和收合. 不错, 这个分组的位置, 正是我们每个区的头视图, 一定要记得, 分区!!!!!!!!

在区头视图返回的这个方法里:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
}

这是我们搞事情的第一步, 在这里你可以返回Button, 也可以是其他视图(记得关联方法, UIImageView的话记得打开交互), 这里不管你生成返回的是哪个View, 要记得给这个View添加tag值, 而这个值, 要跟section值有关联, 你可以是1000+section, 也可以是250+section, 什么都可以, 不过最好不要直接写section, 因为系统本身会占用一些小的tag值, 为了避免冲突, 还是写大点好. 这样, 我们就给section关联起来了.为什么要关联它呢, 有什么用呢?

当然有用! 在这个Button触发的Action里, 我们把tag值带了进去,然而又如何和我们的折叠关联起来呢?方法是有点,当我们点击Button触发方法后, 就要去刷新我们的Tableview了,但是这时候一切其实都没有改变的, 那样怎样改变呢? 不错, 就是加个全局变量(属性值也行), 在这个Action里进行赋值, 可以是tag值, 也可以是section值(即减去你自己加上去的大数1000,250,...).

/// 全局变量用于记录自己点击了哪个区,想要展开哪一区

static NSInteger mySection = 1000;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == mySection) {
//返回你要返回的行数,可能是你解析出来的数据的数组的count值, 也可能是其他, 这个自己控制, 如果还有层级关系, 可返回1, 在自定义cell方法, 继续此方法
        return 1;
    }else {
//没有点击就返回0(这里讲解的是互斥cell, 只展开一个区, 展开多去下面会继续分享)
        return 0;
    }
}

以上, 一个简单的互斥cell的展开就完成了.(还有两种方法, 有兴趣的朋友可以试一下,使用KVO进去监听, 或者使用button的selected属性去判断), 这个根据自己的洗好和擅长, 都可以实现的.

button.selected = YES;
// 或者
button.selected = NO;

/**
** 接下来我们说一下如何展开和关闭多个cell,
***/
基本思路: 与折叠一个cell大同小异, 但是不是设置一个全局变量, 而是一个数组, 去保存每区应该或者说你想让它返回的行数,当然啦, 如果你返回一个写入一个, 那么数组会好不客气的越界, 所以, 在你解析数据的方法里, 就要来给数组填充数据了,当然, 可以全是假的, 也可以全部是真的, 可以诠释0, 也是是实际的个数, 注意数组里不能添加非对象元素.

// self.dataArray 是解析数据得到的元素集合, 你的model应该偶素放在这了里面的.self.sectionAry是你自定义的来管理每个区返回多少行的数组
if (self.dataArray.count != 0) {
        for (int i = 0; i<self.dataArray.count; i++) {
            [self.sectionAry addObject:@NO];
        }
        [self.myTableView reloadData];
    }
//这样, 在解析数据后, 直接就得到了每个区是否返回多少行了(也可以是实际个数, 如果你的没区不是一行).

然后, 在前面说过的透视图中Button触发的方法中, 来控制是否显示就OK了,当你点击的时候可以让他们互斥,这样点击就可以无限展开和关闭了.多个直接也不会相互影响.

- (void)aBtnAction:(UIButton *)sender{

sender.selected = !sender.selected;// 注意使用!
    NSInteger newTag = sender.tag - 1000;
// 改变你点击的那个区的值,替换数组响应位置的值就可以了
    [self.sectionAry replaceObjectAtIndex:newTag withObject:@(![self.sectionAry[newTag] boolValue])];
    [self.myTableView reloadData];// 刷新, 便会响应改变
}

//然后, 你会在下面的方法里看到效果

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// 点击哪个, 都会响应变化, 根据需要来控制返回值.
    if ([self.sectionAry[section] boolValue]) {
        return 0;
    }else
    {
        return 1;
    }
}

如此, 多行同时或者不同时展开关闭也就实现了, 思想就是这些, 要注意灵活运用.有问题可留言.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容