当我更改行数时,具有 rowHeight UITableViewAutomaticDImension 的 UITableView 不会更新

UITableView with rowHeight UITableViewAutomaticDImension does not update when I change the number of lines

我有一个 UITableViewCell,底部有一个描述标签,如下所示:

点击描述标签可在 30 之间切换 numberOfLines

- (void)awakeFromNib {
    [super awakeFromNib];
    [self setupView];
}

-(void) setupView
{

    UITapGestureRecognizer * gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleNumberOfLines)];
    self.jobDescriptionLabel.userInteractionEnabled = YES;
    [self.jobDescriptionLabel addGestureRecognizer:gestureRecognizer];
}

- (void) toggleNumberOfLines {
    if(self.jobDescriptionLabel.numberOfLines != 0){
        self.jobDescriptionLabel.numberOfLines = 0;
    }else{
        self.jobDescriptionLabel.numberOfLines = kNumberOfLines;
    }
    [self.jobDescriptionLabel sizeToFit];
    [self layoutIfNeeded];
}

当我点击标签时,行数确实发生了变化,但单元格没有扩展以适应新的行数。我该如何解决?

折叠(默认):

展开:

当单元格对其子视图进行布局时,table 视图实际上没有任何方式知道任何内容已更改。您必须手动告诉 table 视图重新计算。

您可能想要重新加载 table 视图,或者至少是发生更改的单元格。

查看 reloadData 以重新加载整个 table 视图,或者 reloadRowsAtIndexPaths: 如果您只想重新加载 Apple reference docs 中的特定索引。

您可以在 heightForRowAtindexPath: 中更新表格视图单元格高度。 调用 reloadRowsAtIndexPath 方法更新 UITableView 的单行。

self.dataTableView.beginUpdates()
self.dataTableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: UITableViewRowAnimation.automatic)
self.dataTableView.endUpdates()

如果您的约束设置正确,您不需要重新加载数据 --- 不需要整个 table,甚至不需要重新加载受影响的行。

最好的方法是将委托函数添加回您的 table 视图控制器,然后连续调用这些行:

tableView.beginUpdates()
tablebleView.endUpdates()

这将告诉自动布局重新计算行高。

编辑: 检查我的答案 - 其中包括一个 link 到演示项目 - 此处: