一.插入新的cell
原理:
(1)定義是否展開,和展開的cell的下標
@property (assign, nonatomic) BOOL isExpand; //是否展開 @property (strong, nonatomic) NSIndexPath *selectedIndexPath;//展開的cell的下標
(2)創建兩個不同的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; if (self.isExpand && self.selectedIndexPath.row < indexPath.row && indexPath.row <= self.selectedIndexPath.row + ExpandCount) { // Expand cell cell = [tableView dequeueReusableCellWithIdentifier:@"CsutomExpansionCell" forIndexPath:indexPath]; } else { // Normal cell cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath]; } return cell; }
(3)創建你需要的cell的數量
if (self.isExpand) { return CellCount + ExpandCount; } return CellCount;
(4)點擊的時候向點擊的cell下面插入你需要展示的cell(可展開多個),再次點擊刪除
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (!self.selectedIndexPath) { self.isExpand = YES; self.selectedIndexPath = indexPath; [self.tavleView beginUpdates]; [self.tavleView insertRowsAtIndexPaths:[self indexPathsForExpandRow:indexPath.row] withRowAnimation:UITableViewRowAnimationTop]; [self.tavleView endUpdates]; } else { if (self.isExpand) { if (self.selectedIndexPath == indexPath) { self.isExpand = NO; [self.tavleView beginUpdates]; [self.tavleView deleteRowsAtIndexPaths:[self indexPathsForExpandRow:indexPath.row] withRowAnimation:UITableViewRowAnimationTop]; [self.tavleView endUpdates]; self.selectedIndexPath = nil; } else if (self.selectedIndexPath.row < indexPath.row && indexPath.row <= self.selectedIndexPath.row + ExpandCount) { } else { self.isExpand = NO; [self.tavleView beginUpdates]; [self.tavleView deleteRowsAtIndexPaths:[self indexPathsForExpandRow:self.selectedIndexPath.row] withRowAnimation:UITableViewRowAnimationTop]; [self.tavleView endUpdates]; self.selectedIndexPath = nil; } } } } #pragma mark - other - (NSArray *)indexPathsForExpandRow:(NSInteger)row { NSMutableArray *indexPaths = [NSMutableArray array]; for (int i = 1; i <= ExpandCount; i++) { NSIndexPath *idxPth = [NSIndexPath indexPathForRow:row + i inSection:0]; [indexPaths addObject:idxPth]; } return [indexPaths copy]; }
二.在不同的section里插入cell
原理:
(1)定義是否展開,和展開的cell的下標
(2)創建兩個不同的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; if (self.isExpand && self.selectedIndexPath.section == indexPath.section) { // Expand Cell cell = [tableView dequeueReusableCellWithIdentifier:@"CsutomExpansionCell" forIndexPath:indexPath]; } else { // Normal Cell cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath]; } return cell; }
(3)創建你需要展示普通狀態下cell,section的數量
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return SectionCount; }
(4)改變你展開的時候,展開的section的cell的數量
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (self.isExpand && self.selectedIndexPath.section == section) { return 1 + ExpandCount; //多個數量 } return 1; }
(5)點擊的時候向點擊的cell的section內插入你需要展示的cell(可展開多個),再次點擊刪除
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (!self.selectedIndexPath) { self.isExpand = YES; self.selectedIndexPath = indexPath; [self.tableView beginUpdates]; [self.tableView insertRowsAtIndexPaths:[self indexPathsForExpandSection:indexPath.section] withRowAnimation:UITableViewRowAnimationTop]; [self.tableView endUpdates]; } else { if (self.isExpand) { if (self.selectedIndexPath == indexPath) { self.isExpand = NO; [self.tableView beginUpdates]; [self.tableView deleteRowsAtIndexPaths:[self indexPathsForExpandSection:indexPath.section] withRowAnimation:UITableViewRowAnimationTop]; [self.tableView endUpdates]; self.selectedIndexPath = nil; } else if (self.selectedIndexPath.row != indexPath.row && indexPath.section <= self.selectedIndexPath.section) { // Select the expand cell, do the relating dealing. } else { self.isExpand = NO; [self.tableView beginUpdates]; [self.tableView deleteRowsAtIndexPaths:[self indexPathsForExpandSection:self.selectedIndexPath.section] withRowAnimation:UITableViewRowAnimationTop]; [self.tableView endUpdates]; self.selectedIndexPath = nil; } } } } - (NSArray *)indexPathsForExpandSection:(NSInteger)section { NSMutableArray *indexPaths = [NSMutableArray array]; for (int i = 1; i <= ExpandCount; i++) { NSIndexPath *idxPth = [NSIndexPath indexPathForRow:i inSection:section]; [indexPaths addObject:idxPth]; } return [indexPaths copy]; }
三.更改cell的高度
原理:
(1)定義是否展開,和展開的cell的下標
(2)創建一個的cell,分上半部分和下半部分
(3)創建cell的高度,分普通情況下的高度和展開后的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.isExpand && self.selectedIndexPath == indexPath) { return 121; } else { return 44; } }
(4)點擊的時候向點擊的cell刷新點擊的cell
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (!self.selectedIndexPath) { self.isExpand = YES; self.selectedIndexPath = indexPath; [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView endUpdates]; } else { if (self.isExpand) { if (self.selectedIndexPath == indexPath) { self.isExpand = NO; [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView endUpdates]; self.selectedIndexPath = nil; } else { self.isExpand = NO; [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[self.selectedIndexPath] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView endUpdates]; self.selectedIndexPath = nil; } } } }
四.自定義section,點擊展開相應的cell(下午有空寫...)
demo鏈接
http://pan.baidu.com/s/1c0YQDNE
效果圖