1. 程式人生 > >點選UITableView的cell展開收縮

點選UITableView的cell展開收縮

在專案中有個需求,點選表檢視的單元格展開,再點選另外一個單元格或者本身又收縮,經過一段時間嘗試,實現了該功能,現在記錄分享總結下。
 首先要理解UITableView代理方法呼叫的先後順序。
 當初始化UITableView後,代理回撥順序如下
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