注意:對于復雜的列表,不建議使用通過添加約束來計算cell高度。之前的項目中會有明顯的卡頓,后來手動計算frame處理的,就流暢多了。
之前看過其他人寫的相關(guān)博客,有些內(nèi)容不清楚,或者是沒有考慮周全。這里就對這個簡單的問題,進行相關(guān)的說明。對其中的細節(jié)問題,進行相應(yīng)的解釋。
這里主要討論,當cell中包含image,label,textView三類控件的時候,如何動態(tài)計算cell高度。其中image的大小是固定的,label和textView固定寬度后,高度根據(jù)內(nèi)容動態(tài)變化。
對cell上的控件添加必要的約束,其中cell的高度與image的大小無關(guān),image的大小固定。cell的子視圖label和textView在豎直和水平方向上與cell的距離固定。這樣,cell的高度就完全由cell的寬度和label或textView的內(nèi)容決定。(文章結(jié)尾源碼中可以查看)

給Cell添加約束
計算Cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell1 *cell = tableViewCell;
NSDictionary *dic = _dataArray[indexPath.row];
cell.textView.text = dic[@"textViewText"];
cell.label.text = dic[@"labelText"];
//屏幕寬度-110 = label的寬度
cell.label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 110;
//size 的大小為cell.contentView的大小,
//在自動計算cell大小時,textView的長寬都是0;
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
//根據(jù)textView的內(nèi)容,計算textView的大小
CGSize textViewSize = [cell.textView sizeThatFits:CGSizeMake([UIScreen mainScreen].bounds.size.width - 110, FLT_MAX)];
//由于textView不會影響size的大小,所以比較出一個最大的高度值。
CGFloat height = size.height + (textViewSize.height);
height = height > 109 ?height : 109;
return height + 1;
}
代碼中 height + 1 必不可少,不然某個控件的文字就顯示不出來。因為contentview的高度加上分割線的高度(1)才是Cell的高度。
這里是實現(xiàn)動態(tài)計算Cell高度的Demo地址:https://coding.net/u/hufeng/p/CellHeightDemo/git