UITableView的展开与收缩

it2025-05-03  8

前言

在写shareAPP时碰到有tableview的点击选择收缩,我们在app中也经常会用到这个,就记录下来

思路

1.新建TAYTableViewCell 继承自UITableViewCell,新建cell可以看这篇 2.用可变数组添加更改元素,用可变字符串记录被选择的元素 3. 创建一个BOOL值记录tableview的开合状态,用button控制事件 4. 将被选择的元素添加到可变数组第一个,并删除该元素在原始位置的值 5. 根据开合状态调节tableview的section数

可能文字解释起来比较啰嗦,下来看代码

新建cell

在这里对创建自定义cell就不做过多的解释了,因为该cell只添加了一个label,也可使用UITableView自带的cell

TAYTableViewCell.h 文件里:

@property UILabel *label;

TAYTableViewCell.m 文件里:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; self.label = [[UILabel alloc] init]; [self.contentView addSubview:_label]; return self; } - (void)layoutSubviews { [super layoutSubviews]; _label.frame = CGRectMake(0, 0, 300, 30); } - (void)awakeFromNib { [super awakeFromNib]; // Initialization code } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state }

将cell应用于tabkeView,并进行收缩操作:

ViewController.h 文件里:

#import <UIKit/UIKit.h> #import "TAYTableViewCell.h" @interface ViewController : UIViewController < UITableViewDataSource, UITableViewDelegate > @property UITableView *tableView; @property UIButton *button; @property NSMutableArray *strArr; @property NSMutableString *str; @property BOOL openSelect; @property TAYTableViewCell *cell; @end

ViewController.m 文件里:

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //初始状态为关闭 _openSelect = NO; //创建一个可变数组并赋值 _strArr = [[NSMutableArray alloc] init]; [_strArr addObject:@"原创作品"]; [_strArr addObject:@"设计资料"]; [_strArr addObject:@"设计师观点"]; [_strArr addObject:@"设计教程"]; //创建一个tableview _tableView = [[UITableView alloc] initWithFrame:CGRectMake(275, 155, 100, 25) style:UITableViewStylePlain]; [self.view addSubview:_tableView]; //创建一个button _button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [self.view addSubview:_button]; _button.frame = CGRectMake(375, 155, 25, 25); [_button setImage:[UIImage imageNamed:@"close1.png"] forState:UIControlStateNormal]; //添加button事件 [_button addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchDown]; //设置tableview代理 _tableView.delegate = self; _tableView.dataSource = self; //注册cell [_tableView registerClass:[TAYTableViewCell class] forCellReuseIdentifier:@"111"]; } //初始化cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { _cell = [tableView dequeueReusableCellWithIdentifier:@"111" forIndexPath:indexPath]; //如果没有,创建一个cell if(!_cell){ _cell = [[TAYTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"111"]; _cell.selectionStyle = UITableViewCellSelectionStyleGray; } //对tableview的状态进行判断 if(_openSelect == YES){ _cell.textLabel.text = _strArr[indexPath.row]; _cell.textLabel.font = [UIFont systemFontOfSize:13]; } else { _cell.textLabel.text = _strArr[indexPath.row]; _cell.textLabel.font = [UIFont systemFontOfSize:13]; } return _cell; } - (void)pressBtn:(UIButton *)btn{ //对现在的状态进行判断 if(_openSelect == NO){ self.tableView.frame = CGRectMake(275, 155, 100, 100); _openSelect = YES; [btn setImage:[UIImage imageNamed:@"open.png"] forState:UIControlStateNormal]; } else { self.tableView.frame = CGRectMake(275, 155, 100, 25); _openSelect = NO; [btn setImage:[UIImage imageNamed:@"close1.png"] forState:UIControlStateNormal]; } //刷新tableview数据 [_tableView reloadData]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //如果是未打开的,行数为1 if(_openSelect == NO){ return 1; } else { //如果已经打开tableview,行数为4 return 4; } } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 25; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //记录点击的元素 _str = [NSMutableString stringWithString:_strArr[indexPath.row]]; //将该元素提到第一个,insertObject:atIndex:函数自动后移其他元素 [_strArr insertObject:_str atIndex:0]; //因为加入了一个元素,它本来存在的地方就后移一个,删除该元素 [_strArr removeObjectAtIndex:indexPath.row + 1]; //收缩tableview _openSelect = NO; //将tableview的大小改为一格的大小 _tableView.frame = CGRectMake(275, 155, 100, 25); //button图标变为合上的图标 [_button setImage:[UIImage imageNamed:@"close1.png"] forState:UIControlStateNormal]; //刷新tableview [_tableView reloadData]; }

效果图:

点击后: 选择后(这里以选择设计师观点为例): 再次打开:

最新回复(0)