點選UITableView的cell展開收縮
阿新 • • 發佈:2019-02-17
在專案中有個需求,點選表檢視的單元格展開,再點選另外一個單元格或者本身又收縮,經過一段時間嘗試,實現了該功能,現在記錄分享總結下。 首先要理解UITableView代理方法呼叫的先後順序。 當初始化UITableView後,代理回撥順序如下
需要宣告一個全域性BOOL變數isOpen,記錄當前cell的狀態,宣告一個NSInterge型別selectedIndex,記錄選擇的cell的row。 在heightForRowAtIndexPath代理裡面實現//選中狀態返回的高度
1://返回cell個數 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2://返回每行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 3://請求資料元代理為tableView插入需要的cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 4://監聽點選的cell - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
需要宣告一個全域性BOOL變數isOpen,記錄當前cell的狀態,宣告一個NSInterge型別selectedIndex,記錄選擇的cell的row。 在heightForRowAtIndexPath代理裡面實現//選中狀態返回的高度
if (indexPath.row == selectedIndex.row && selectedIndex != nil ) {
if (isOpen == YES) {
//cell上的label高度自適應 CGSize size = [textStr sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(290, 1000) lineBreakMode:NSLineBreakByWordWrapping]; CGFloat f = size.height; if (indexPath.row == [self.dataArr count]-1){ return 153.8+(f - 21); } return 155+(f - 21); }else{ return 67; } }
同樣在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath裡實現一樣的條件
if (indexPath.row == selectedIndex.row && selectedIndex != nil) {
//如果是展開
if (isOpen == YES) {
//xxxxxx
}else{
//收起
}
//不是自身
} else {
}
當點選時候在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //將索引加到陣列中 NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; //判斷選中不同row狀態時候 // if (self.selectedIndex != nil && indexPath.row != selectedIndex.row) { if (self.selectedIndex != nil && indexPath.row == selectedIndex.row) { //將選中的和所有索引都加進陣列中 // indexPaths = [NSArray arrayWithObjects:indexPath,selectedIndex, nil]; isOpen = !isOpen; }else if (self.selectedIndex != nil && indexPath.row != selectedIndex.row) { indexPaths = [NSArray arrayWithObjects:indexPath,selectedIndex, nil]; isOpen = YES; } //記下選中的索引 self.selectedIndex = indexPath; //重新整理 [tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; }
經過不斷除錯,終於實現了點選任意一個cell展開收縮效果
轉自:http://m.blog.sina.com.cn/s/blog_6b8c3d7a0101apmd.html#page=4