【iOS】折叠cell

server/2024/10/20 13:32:59/

折叠cell

  • 前言
  • 实现原理
  • 代码实现
  • 原理讲解
  • 代码展示

前言

暑假在仿写3G share时使用到了折叠cell,故而现在来总结一下折叠cell,如有不足,还望指正。

实现原理

在OC中,scrollview是tableview的父类,要想实现折叠cell的效果,我们需要控制在点击按钮前后,tableview的高度变换,同时在点击cell时,将点击的cell放在数组的第一个元素,同时收回展示的cell即可。这样我们就可以实现cell的切换。

代码实现

这里先展示实现的效果:
在这里插入图片描述

原理讲解

折叠cell其实就是通过按钮控制tableview的大小,在每次点击显示的单独的一个cell的时候,将整个tableview显示出来,在点击非第一个cell的时候,将数组的顺序重新排列,让点击的cell排在第一位,同时缩小tableview的大小,并且刷新tableview,这样做,就可以实现折叠cell的效果了。

代码展示

- (void)viewDidLoad {[super viewDidLoad];self.arr = [NSMutableArray arrayWithObjects:@"111", @"222", @"333", @"444", nil];_tableview = [[UITableView alloc] init];self.tableview.frame = CGRectMake(200, 300, 100, 30);self.tableview.delegate = self;self.tableview.dataSource = self;self.btn = [UIButton buttonWithType:UIButtonTypeCustom];self.btn.frame = CGRectMake(170, 300, 30, 30);self.btn.tag = 102;[self.btn addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];[self.btn setImage:[UIImage imageNamed:@"未勾选_副本.png"] forState:UIControlStateNormal];[self.btn setImage:[UIImage imageNamed:@"已勾选_副本.png"] forState:UIControlStateSelected];//按钮的两个状态self.btn.selected = NO;[self.view addSubview:self.btn];[self.view addSubview:self.tableview];
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{return 30;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return 4;
}- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return 1;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"id"];if(cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"id"];}cell.textLabel.text = _arr[indexPath.row];cell.textLabel.textColor = [UIColor blackColor];return  cell;
}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{NSString* str = _arr[indexPath.row];[_arr removeObjectAtIndex:indexPath.row];[_arr insertObject:str atIndex:0];[self.tableview reloadData];[self press];
}-(void) press
{if(self.btn.tag == 101) {self.tableview.frame = CGRectMake(200, 300, 100, 30);self.btn.tag++;self.btn.selected = NO;} else {self.tableview.frame = CGRectMake(200, 300, 100, 150);self.btn.tag--;self.btn.selected = YES;}
}//控制是否更改tableview的范围@end

http://www.ppmy.cn/server/113540.html

相关文章

Redis的设计哲学和实现方式

‌ Redis是一个可用性和分区容忍性优先的系统。 Redis的设计和实现强调了高可用性和高性能,而不是严格的数据一致性。 这一点可以从Redis的分布式设计、数据压缩支持、以及异步IO机制等方面看出。 ‌分布式设计与数据一致性‌:Redis的分布式设计中采用了…

rust feature 简介

Rust 的 feature 是一种机制,用于在编译时选择性地启用或禁用代码的某些部分。通过 feature,你可以在 Cargo.toml 中定义哪些功能需要启用,并在代码中通过条件编译来控制代码的编译与否。下面是 feature 机制的详解: 1. 基本概念…

一文梳理RAG(检索增强生成)的现状与挑战

一 RAG简介 大模型相较于过去的语言模型具备更加强大的能力,但在实际应用中,例如在准确性、知识更新速度和答案透明度方面,仍存在不少问题,比如典型的幻觉现象。因此,检索增强生成 (Retrieval-Augmented Generation, …

Maven快速上手使用指南的笔记

Maven Mini Guides Configuring for Reproducible Builds 使用Maven实现重复构建。 检查当前使用的插件的版本。 mvn artifact:check-buildplan修改pom.xml&#xff0c;增加如下配置&#xff0c;显式指定project.build.outputTimestamp的取值&#xff1a; <properties>…

ubantu安装mysql + redis数据库并使用C/C++操作数据库

mysql 安装mysql ubuntu 安装 MySql_ubuntu安装mysql-CSDN博客 Ubuntu 安装 MySQL 密码设置_ubuntu安装mysql后设置密码-CSDN博客 service mysql restart1 C/C连接数据库 C/C 连接访问 MySQL数据库_c mysql-CSDN博客 ubuntu安装mysql的c开发环境_ubuntu 搭建mysql c开发…

2024 数学建模高教社杯 国赛(A题)| “板凳龙”舞龙队 | 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用等距螺线&#xff0c;多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

docker进入容器运行命令

前言 Docker是一种流行的容器化平台&#xff0c;它能够快速构建、交付和运行应用程序。在使用Docker时&#xff0c;我们经常需要进入容器进行调试、管理和运行命令等操作。 进入 docker 容器需要执行以下步骤&#xff1a;打开终端窗口。使用 docker ps 命令查看正在运行的容器…

最新SMS测压SMS源码 全新版本

php调至7.3 设置伪静态为thinkphp 设置网站运行目录为public 编辑根目录下的.env文件配置数据库信息 详细教程请看源码内置说明文本&#xff01; 亲测截图&#xff01;真实有效&#xff01; 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/8972239…