美文网首页
点击UITableView的cell展开收缩(一)

点击UITableView的cell展开收缩(一)

作者: 来敲代码 | 来源:发表于2018-08-16 09:13 被阅读245次

    首先要理解UITableView代理方法调用的先后顺序。

    当初始化UITableView后,代理回调顺序如下

    - (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
    

    [tableview刷新某个区域(section)或者某一行(row)

    //一个section刷新    
    NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2];    
    [tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];    
    //一个cell刷新    
    NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0];    
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
    

    需要声明一个全局BOOL变量isOpen,记录当前cell的状态,声明一个NSInterge类型selectedIndex,记录选择的cell的row。

    在heightForRowAtIndexPath代理里面实现//选中状态返回的高度

      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 (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];
    }
    
    

    相关文章

      网友评论

          本文标题:点击UITableView的cell展开收缩(一)

          本文链接:https://www.haomeiwen.com/subject/hcwwbftx.html