[iOS] 折叠 cell

发布于:2025-09-05 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

前言

1.原理

2.折叠 cell 的点击选中

3.折叠 cell 高度的变化

4.实现效果

5.总结


前言

折叠 cell 是在 3GShare 中写过的一个小控件,这篇博客是一个小小的总结。

1.原理

在这里的核心就是我们可以通过改变按钮的 tag 值来判断我们是否应该展开还是回收,还有就是我们还可以通过代码来改变我们的 cell 的行数,并且可以通过- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath这个方法来实现点击单元格的切换。

2.折叠 cell 的点击选中

- (void)toggleFold {
    if (self.zhedie.tag == 1002) {
        // 折叠
//        [self.zhedie setTitle:@"展开" forState:UIControlStateNormal];
        [self.zhedie setImage:[UIImage imageNamed:@"向左箭头"] forState:UIControlStateNormal];
        self.tableView.frame = CGRectMake(270, 200, 95, 20);
        self.zhedie.tag = 1001;
    } else {
        // 展开
//        [self.zhedie setTitle:@"折叠" forState:UIControlStateNormal];
        [self.zhedie setImage:[UIImage imageNamed:@"向下箭头"] forState:UIControlStateNormal];
        self.tableView.frame = CGRectMake(270, 200, 95, 80);
        self.zhedie.tag = 1002;
    }
    [self.tableView reloadData];
}
- (void)pressUp:(UIButton *)btn {
    [self toggleFold];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 1) {
        self.selectedItem = self.dataArray[indexPath.row];
        [self toggleFold];
    }
}

我在这里使用了一个函数来封装我的 cell 的收缩和展开,因为在点击按钮和点击表格都要实现切换。

3.折叠 cell 高度的变化

在这里我会给出通过按钮 tag 值来改变 tableView 的高度的点击函数。

- (void)toggleFold {
    if (self.zhedie.tag == 1002) {
        // 折叠
//        [self.zhedie setTitle:@"展开" forState:UIControlStateNormal];
        [self.zhedie setImage:[UIImage imageNamed:@"向左箭头"] forState:UIControlStateNormal];
        self.tableView.frame = CGRectMake(270, 200, 95, 20);
        self.zhedie.tag = 1001;
    } else {
        // 展开
//        [self.zhedie setTitle:@"折叠" forState:UIControlStateNormal];
        [self.zhedie setImage:[UIImage imageNamed:@"向下箭头"] forState:UIControlStateNormal];
        self.tableView.frame = CGRectMake(270, 200, 95, 80);
        self.zhedie.tag = 1002;
    }
    [self.tableView reloadData];
}
- (void)pressUp:(UIButton *)btn {
    [self toggleFold];
}

4.实现效果

5.总结

这里我给出完整的代码

#import "ViewController.h"

@interface ViewController () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *dataArray;
@property (nonatomic, strong) UIButton *zhedie;
@property (nonatomic, strong) NSString *selectedItem;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.dataArray = [NSMutableArray arrayWithObjects:@"cell1", @"cell2", @"cell3", nil];
    self.selectedItem = self.dataArray.firstObject;
    
    // tableView
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(270, 200, 95, 20)
                                                  style:UITableViewStylePlain];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];
    
    self.zhedie = [UIButton buttonWithType:UIButtonTypeSystem];
    self.zhedie.frame = CGRectMake(270 + 95, 200, 40, 20);
    self.zhedie.backgroundColor = [UIColor clearColor];
//    [self.zhedie setTitle:@"展开" forState:UIControlStateNormal];
    [self.zhedie setImage:[UIImage imageNamed:@"向左箭头"] forState:UIControlStateNormal];
    [self.zhedie setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [self.zhedie addTarget:self action:@selector(pressUp:) forControlEvents:UIControlEventTouchUpInside];
    self.zhedie.tag = 1001;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return (self.zhedie.tag == 1001) ? 1 : 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.zhedie.tag == 1001) {
        return 1;
    } else {
        if (section == 0) return 1;
        return self.dataArray.count;
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellID = @"ID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }
    
    if (self.zhedie.tag == 1001) {
        cell.textLabel.text = self.selectedItem;
    } else {
        if (indexPath.section == 0) {
            cell.textLabel.text = self.selectedItem;
            cell.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1];
        } else {
            cell.textLabel.text = self.dataArray[indexPath.row];
            cell.backgroundColor = [UIColor whiteColor];
        }
    }
    
    cell.textLabel.font = [UIFont systemFontOfSize:12.0];
    return cell;
}
- (void)toggleFold {
    if (self.zhedie.tag == 1002) {
        // 折叠
//        [self.zhedie setTitle:@"展开" forState:UIControlStateNormal];
        [self.zhedie setImage:[UIImage imageNamed:@"向左箭头"] forState:UIControlStateNormal];
        self.tableView.frame = CGRectMake(270, 200, 95, 20);
        self.zhedie.tag = 1001;
    } else {
        // 展开
//        [self.zhedie setTitle:@"折叠" forState:UIControlStateNormal];
        [self.zhedie setImage:[UIImage imageNamed:@"向下箭头"] forState:UIControlStateNormal];
        self.tableView.frame = CGRectMake(270, 200, 95, 80);
        self.zhedie.tag = 1002;
    }
    [self.tableView reloadData];
}
- (void)pressUp:(UIButton *)btn {
    [self toggleFold];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 1) {
        self.selectedItem = self.dataArray[indexPath.row];
        [self toggleFold];
    }
}
@end


网站公告

今日签到

点亮在社区的每一天
去签到