【iOS】折叠cell

文章目录

前言

折叠cell的实现效果即为一个可点击的cell格,未点击时显示的只有最上面的那一格,可以点击后将点击的替换最上面的那格并把这个单元格恢复为只有一格的状态,主要的步骤即为在点击时设置按钮函数来调整cell的高度

代码示例

按钮函数

在点击这里,我主要设置了一个BOOL类型的实例变量,来记录每次的点击的状态,点击函数:

objc 复制代码
- (void)pressUp: (UIButton*)btn {
    _isFold = !_isFold;
  //这里必须进行状态的改变,保证两种点击的状态可以进行交换
    if (_isFold == NO) {
        [btn setImage: [UIImage imageNamed: @"left.png"] forState: UIControlStateNormal];
        _tableView.frame = CGRectMake(150, 200, 100, 30);
    } else {
        [btn setImage: [UIImage imageNamed: @"bottom.png"] forState: UIControlStateNormal];
        _tableView.frame = CGRectMake(150, 200, 100, 150);
    }
}

点击单元格的函数

点击时我们要记录点击时选择的单元格的字符,将这个字符插入到数组的第一个位置(其他的就相当被挤至下一个),之后再更新单元格的状态,并恢复单元格的点击前的状态:

objc 复制代码
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  //获取选择字符
    NSString *selected = _dataArray[indexPath.section];
  //从整个数组移除所获取字符并插入到第一个位置  
  [_dataArray removeObjectAtIndex: indexPath.section];
    [_dataArray insertObject: selected atIndex:0];
  //重新加载更新单元格
    [_tableView reloadData];
    [self pressUp: _fold];
}

完整代码

objc 复制代码
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _tableView = [[UITableView alloc] initWithFrame: CGRectMake(150, 200, 100, 150) style: UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    _dataArray = [NSMutableArray arrayWithObjects: @"1", @"2", @"3", @"4", @"5", nil];
    [self.view addSubview: _tableView];
    _fold = [UIButton buttonWithType: UIButtonTypeSystem];
    _fold.frame = CGRectMake(150 + 100, 200, 20, 30);
    _fold.backgroundColor = [UIColor whiteColor];
    [_fold setImage: [UIImage imageNamed: @"left.png"] forState: UIControlStateNormal];
    [_fold addTarget: self action: @selector(pressUp:) forControlEvents: UIControlEventTouchUpInside];
    _isFold = NO;
    [self.view addSubview: _fold];
    if (_isFold == NO) {
        _tableView.frame = CGRectMake(150, 200, 100, 30);
    }
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *selected = _dataArray[indexPath.section];
    [_dataArray removeObjectAtIndex: indexPath.section];
    [_dataArray insertObject: selected atIndex:0];
    [_tableView reloadData];
    [self pressUp: _fold];
}
- (void)pressUp: (UIButton*)btn {
    _isFold = !_isFold;
    if (_isFold == NO) {
        [btn setImage: [UIImage imageNamed: @"left.png"] forState: UIControlStateNormal];
        _tableView.frame = CGRectMake(150, 200, 100, 30);
    } else {
        [btn setImage: [UIImage imageNamed: @"bottom.png"] forState: UIControlStateNormal];
        _tableView.frame = CGRectMake(150, 200, 100, 150);
    }
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *strID = @"ID";
    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier: strID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: strID];
    }
    cell.textLabel.text = [_dataArray objectAtIndex: indexPath.section];
    cell.textLabel.font = [UIFont systemFontOfSize: 20];
    cell.textLabel.textAlignment = NSTextAlignmentCenter;
    return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 5;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 30;
}

实现效果

相关推荐
pop_xiaoli15 小时前
OC-实现下载单例类
ios·objective-c·cocoa·xcode
denggun1234515 小时前
Material 和 Cupertino
macos·objective-c·cocoa
zhyongrui16 小时前
SnipTrip 菜单 Liquid Glass 实现方案:结构、材质、交互与深浅色策略
ios·性能优化·swiftui·交互·开源软件·材质
zhyongrui17 小时前
SnipTrip 不发烫的实现路径:局部刷新 + 合成缓存 + 峰值削减
ios·swiftui
晚霞的不甘18 小时前
Flutter for OpenHarmony 实现 iOS 风格科学计算器:从 UI 到表达式求值的完整解析
前端·flutter·ui·ios·前端框架·交互
初级代码游戏1 天前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏1 天前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui2 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
Boxsc_midnight2 天前
【openclaw+imessage】【免费无限流量】集成方案,支持iphone手机+macos
ios·智能手机·iphone
感谢地心引力2 天前
安卓、苹果手机无线投屏到Windows
android·windows·ios·智能手机·安卓·苹果·投屏