当前位置: 首页 > news >正文

简单的折叠cell

文章目录

  • tableView的协议执行顺序
  • 折叠cell
    • 基本流程
    • 实战演练

tableView的协议执行顺序

在开始正式的折叠cell讲解之前,我先来讲讲tableView的协议执行顺序

对一个固定高度的tableView(即不使用我在share总结中使用的自动计算高度的内容),一个tableView的协议方法执行程序如下:

  1. nuberOfSectionTableView 先取得这个tableView有多少个分区
  2. 调用numberOfRowsInSection来获取每个节有多少个cell
  3. 使用cellForRowAtIndexPath 来得到每个row中的cell
  4. 再用heightForRowAtIndexPath 来获取每个cell应该分配的宽度
  5. heightForHeaderInSectionheightForFooterInSection
  6. 然后取得头节点尾节点视图viewForHeaderInSectionviewForFooterInsection (如果实现的话)
  7. 再次调用heightForRowAtIndexPath方法
  8. willDisplayHeaderViewwillDIsplayFooterView 方法

如果一个tableView不会显示在视图中,那么方法之后执行到numberOfRowsInSection就停止,不会进行剩余的步骤来影响性能

折叠cell

折叠cell是为了简化用户界面,隐藏在通常情况下不需要的部分的一种方法,该方法符合渐进展开原则

在普通用户不需要过多的复杂选项或者信息,或者在需要选择某种风格之类的枚举值的时候可以考虑使用折叠cell

我们一般所说的折叠cell,实际上是在代理方法中,更换tableView的cell数量,来隐藏一部分的cell,在需要的时候,再展示的一个方法

为了在协议中更改cell的数量,我们可以使用一个枚举或者就是简单的布尔值来判断tableView是否展开,从而给tableView返回cell的个数

基本流程

更改流程:

  1. 使用一个按钮(可以是tableView的一个cell本身,或者在头视图上添加一个专门用来展开的按钮)来控制是否展开的布尔值
  2. 在按钮改变后,重新加载tableView剩下的事tableView会处理!

tableView的流程

  1. 正常加载tableView
  2. 在tableView中读取布尔值,根据布尔值来判断cell是否被展开从而渲染cell
  3. 展示

这就是基本的折叠cell的展开流程,我们写一个小demo来展示一下

实战演练

由于代码简单我这里就不使用MVC结构了,直接用View来处理model的数据存储

ViewController.h

#import <UIKit/UIKit.h>#import "FoldAndExtendProtocol.h"
#import "PMHeaderView.h"@class PMFoldCellView;@interface ViewController : UIViewController <UITableViewDelegate,UITableViewDataSource,FoldAndExtendProtocol>
@property (nonatomic, strong)PMFoldCellView* mainView;
@property (nonatomic, strong)PMHeaderView* HeaderView;
@property (nonatomic, strong)NSArray* array1;
@property (nonatomic, strong)NSArray* array2;@property (nonatomic, assign)BOOL isExtend;@end

其中PMHeaderView内部只有一个tableView的属性,FoldAndExtendProtocol 声明了- (**void**)extendCell;这个方法用来控制tableView是否展开

ViewController.m

... // 初始化函数,填充了内容数组,并设置了基本的代理和约束
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {// 根据属性的布尔值来确定当前是否处于展开状态if (self.isExtend) {return 5;} else {return 1;}}
... //设置高度
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//    NSLog(@"cellForRowAtIndexPath");// 不使用自定义cell,使用系统的默认样式UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Mycell"];}// 根据不同的状态来读取不同的数据源if (self.isExtend) {cell.textLabel.text = self.array1[indexPath.row];} else {cell.textLabel.text = self.array2[indexPath.row];}// 在第一个cell中添加控制展开收起的按钮if (indexPath.row == 0) {UIButton* btnExtend = [[UIButton alloc] init];[cell.contentView addSubview:btnExtend];[btnExtend mas_makeConstraints:^(MASConstraintMaker *make) {make.right.equalTo(cell.contentView.mas_right).offset(-10);make.centerY.equalTo(cell.contentView);}];// 根据状态来展示不同状态的按钮if (self.isExtend) {[btnExtend setBackgroundImage:[UIImage systemImageNamed:@"chevron.down"] forState:UIControlStateNormal];} else {[btnExtend setBackgroundImage:[UIImage systemImageNamed:@"chevron.up"] forState:UIControlStateNormal];}[btnExtend addTarget:self action:@selector(extendCell) forControlEvents:UIControlEventTouchUpInside];}return cell;
}- (void) extendCell {// 切换当前状态,然后刷新整个tableViewself.isExtend = !self.isExtend;
//    NSLog(@"点按按钮");[self.mainView.tableView reloadData];}

效果展示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


文章转载自:

http://n11vEXRU.qfqLd.cn
http://KSfATRtv.qfqLd.cn
http://LvetARYJ.qfqLd.cn
http://5cAi2FUV.qfqLd.cn
http://FbltBF72.qfqLd.cn
http://l98PrE1F.qfqLd.cn
http://tnl1fF7z.qfqLd.cn
http://m5BaZXhB.qfqLd.cn
http://msNxblXg.qfqLd.cn
http://NhSjtThV.qfqLd.cn
http://ue3rKInB.qfqLd.cn
http://zQo5uyZT.qfqLd.cn
http://vTx6b81F.qfqLd.cn
http://9CJfaaq6.qfqLd.cn
http://vdfSLnx1.qfqLd.cn
http://Il2ROOeV.qfqLd.cn
http://j1dava5V.qfqLd.cn
http://JmKz3Z5h.qfqLd.cn
http://5244r9Jr.qfqLd.cn
http://q9tzXzOK.qfqLd.cn
http://0Q6gRPLJ.qfqLd.cn
http://OOmvLlcF.qfqLd.cn
http://5sF0rZIb.qfqLd.cn
http://fHWg8yIP.qfqLd.cn
http://hEco3jnz.qfqLd.cn
http://7DQaMZGG.qfqLd.cn
http://7cXlZIC6.qfqLd.cn
http://aFjMIKrH.qfqLd.cn
http://9kowKyXy.qfqLd.cn
http://zvbbC8Pw.qfqLd.cn
http://www.dtcms.com/a/382718.html

相关文章:

  • 贪心算法在边缘计算卸载问题中的应用
  • pyAutoGUI 模块主要功能介绍-(2)键盘功能
  • 基于Qt Creator的Serial Port串口调试助手项目(代码开源)
  • Node.js 编码规范
  • Spring Boot 调度任务在分布式环境下的坑:任务重复执行与一致性保证
  • 【数据结构】 ArrayList深入解析
  • 4. 数系
  • 08 函数式编程
  • 安卓 Google Maps 的使用和开发步骤
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
  • 深入理解 Spring @Async 注解:原理、实现与实践
  • 【Qt开发】显示类控件(三)-> QProgressBar
  • 《Linux——gflags》
  • leetcode35.搜索插入位置
  • Java调用UniHttp接口请求失败?一次开源的深入实践-百度SN签名认证场景下参数乱序问题的三种解决策略
  • MongoDB 监控
  • 【Linux】system V共享内存
  • --- 统一请求入口 Gateway ---
  • 豆包Seedream 4.0多图融合实力派:田园犬+三花猫多场景创作,AI绘画新时代来了!
  • 贪心算法应用:数据包调度问题详解
  • html基本知识
  • 视觉SLAM第10讲:后端2(滑动窗口与位子图优化)
  • Modbus协议原理与Go语言实现详解
  • 模型部署|将自己训练的yolov8模型在rk3568上部署
  • Vue中的slot标签——插槽
  • k8s集群—node节点的删除与添加
  • k8s的dashboard
  • k8s-容器探针和生命周期回调学习
  • 跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
  • 大数据毕业设计选题推荐-基于大数据的结核病数据可视化分析系统-Hadoop-Spark-数据可视化-BigData