动态展开tableView的cell[2]
动态展开tableView的cell[2]
http://code4app.com/ios/%E5%8A%A8%E6%80%81%E6%B7%BB%E5%8A%A0cell/53845f8a933bf0740a8b458a
这份代码也是参考别人而写的-_-!
效果:
其实呢,这份代码本人是不推荐的,很难维护,因为他的原理就是添加删除cell,会有这复杂的删除添加逻辑.
源码:
// // RootViewController.m // InsertTableViewCell // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" @interface RootViewController ()<UITableViewDelegate, UITableViewDataSource> @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) NSMutableArray *dataArray; @end @implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; // 初始化数据源 NSDictionary *dic = @{@"Cell" : @"MainCell", @"isAttached" : @(NO)}; NSArray *array = @[dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic]; _dataArray = [NSMutableArray arrayWithArray:array]; // 初始化tableView _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.delegate = self; _tableView.dataSource = self; [self.view addSubview:_tableView]; } // ==================================== #pragma mark - #pragma mark dataSource // ==================================== - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _dataArray.count; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } // 重绘重用会一直走这个方法 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"重用"); if ([_dataArray[indexPath.row][@"Cell"] isEqualToString:@"MainCell"]) { static NSString *reusedID = @"YouXianMing"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedID]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedID]; } cell.textLabel.text = @"YouXianMing"; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.backgroundColor = [UIColor whiteColor]; return cell; } if ([_dataArray[indexPath.row][@"Cell"] isEqualToString:@"AttachedCell"]) { static NSString *reusedID = @"AttachedCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedID]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedID]; } cell.textLabel.text = @"NoZuoNoDie"; cell.textLabel.textColor = [UIColor redColor]; cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:12.f]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.backgroundColor = [UIColor whiteColor]; return cell; } return nil; } // ==================================== #pragma mark - #pragma mark delegate // ==================================== - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"计算高度"); if ([self.dataArray[indexPath.row][@"Cell"] isEqualToString:@"MainCell"]) { return 50; } else { return 30; } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"选择了第 %d 行", indexPath.row); [tableView deselectRowAtIndexPath:indexPath animated:YES]; NSIndexPath *path = nil; if ([self.dataArray[indexPath.row][@"Cell"] isEqualToString:@"MainCell"]) { // 如果点击的时MainCell,则添加一行 path = [NSIndexPath indexPathForItem:(indexPath.row + 1) inSection:indexPath.section]; } else { path = indexPath; } if ([self.dataArray[indexPath.row][@"isAttached"] boolValue] == YES) { // 关闭附加cell self.dataArray[path.row - 1] = @{@"Cell" : @"MainCell", @"isAttached" : @(NO)}; [self.dataArray removeObjectAtIndex:path.row]; [self.tableView beginUpdates]; [self.tableView deleteRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationAutomatic]; [self.tableView endUpdates]; } else { // 打开附加cell self.dataArray[path.row - 1] = @{@"Cell" : @"MainCell", @"isAttached" : @(YES)}; NSDictionary * addDic = @{@"Cell" : @"AttachedCell", @"isAttached" : @(YES)}; [self.dataArray insertObject:addDic atIndex:path.row]; [self.tableView beginUpdates]; [self.tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationAutomatic]; [self.tableView endUpdates]; } } @end
核心的地方-
执行下面的操作(增加或者删除修改等):
会导致强制计算所有cell的高度:
这一点没有处理好是会影响性能的,注意哦.
没有更多的地方需要说的了......