iOS 回复内容展开效果实现

参考博客

  1. iOS开发~设置label上文字显示不同大小、颜色、字体类型
  2. UILabel自动计算行高 并且 最多显示n行
  3. iOS-UITableViewCell自适应高度最优雅的方法

实现效果

以知乎日报为例,评论回复初始只能预览两行内容,在点击展开按钮改变cell高度将回复内容全部展示出来。

实现思路

这里我采用的cell自适应高度方法是参考博客3博主推荐的方法,可能下面的展开实现方法并不适用于用其他自适应高度方法的代码,但思路都是一样的

  1. 在自定义cell将回复label的numberOfLines属性设置为2,初始预览行数为2。
  2. 然后在自定义cell中写回复的展开和收缩方法:
-(void)cellOpen{
    self.replyLabel.numberOfLines = 0;
}
-(void)cellClose{
    self.replyLabel.numberOfLines = 2;
}
  1. 在评论界面的controller中添加一个二维可变数组的成员变量,数组存储内容为BOOL值,用途是判断长评论和短评论两个section中每个cell的展开状态,数组大小分别为长评论和短评论的个数,在加载页面时将数组初始化,初始展开状态都为NO。
  2. 然后是判断回复文本是否大于两行,这里可以看看参考博客2的方法,计算出回复文本在label中应有的高度再除以label的行高(commentsTableViewCell.replyLabel.font.lineHeight)就可得到行数。如果大于2,就显示展开按钮,否则隐藏回复按钮。这些内容写在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中。同时在其中判断cell的展开状态,代码如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.section == 0) {
        ZHDCommentsTableViewCell  *commentsTableViewCell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
        //判断cell是否处于展开状态
        if ([cellArray[0][indexPath.row]  isEqual: @YES]) {
            [commentsTableViewCell cellOpen];
            commentsTableViewCell.foldButton.selected = YES;
        }

        if ([cellArray[0][indexPath.row]  isEqual: @NO]){
            [commentsTableViewCell cellClose];
            commentsTableViewCell.foldButton.selected = NO;
        }
        return commentsTableViewCell;
    } else{
        ...
    }
}
  1. 最后写展开按钮的点击事件,将点击的按钮作为参数传入点击方法,然后对button取两次父视图获取button所在的cell,并改变cellArray的展开状态,最后reload一下当前cell即可,单独刷新一个cell的方法在下面代码中。注意:不可在点击事件中直接改变传入button的选中状态,这样在tableView复用池的调用中会出现问题,不会得到我们想要的结果。
- (void)reloadCell:(UIButton *)button{
    ZHDCommentsTableViewCell *cell = (ZHDCommentsTableViewCell *)[[button superview] superview];
    NSIndexPath *indexPath = [_commentsView.tabelView indexPathForCell:cell];
    if ([cellArray[indexPath.section][indexPath.row]  isEqual:@YES]) {
        cellArray[indexPath.section][indexPath.row] = @NO;
    } else {
        cellArray[indexPath.section][indexPath.row] = @YES;
    }
    [_commentsView.tabelView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

你可能感兴趣的:(iOS)