注意:對于復(fù)雜的列表潜圃,不建議使用通過添加約束來計(jì)算cell高度。之前的項(xiàng)目中會(huì)有明顯的卡頓舟茶,后來手動(dòng)計(jì)算frame處理的谭期,就流暢多了堵第。
之前看過其他人寫的相關(guān)博客,有些內(nèi)容不清楚隧出,或者是沒有考慮周全踏志。這里就對這個(gè)簡單的問題,進(jìn)行相關(guān)的說明胀瞪。對其中的細(xì)節(jié)問題针余,進(jìn)行相應(yīng)的解釋。
這里主要討論凄诞,當(dāng)cell中包含image圆雁,label,textView三類控件的時(shí)候帆谍,如何動(dòng)態(tài)計(jì)算cell高度伪朽。其中image的大小是固定的,label和textView固定寬度后汛蝙,高度根據(jù)內(nèi)容動(dòng)態(tài)變化驱负。
對cell上的控件添加必要的約束,其中cell的高度與image的大小無關(guān)患雇,image的大小固定跃脊。cell的子視圖label和textView在豎直和水平方向上與cell的距離固定。這樣苛吱,cell的高度就完全由cell的寬度和label或textView的內(nèi)容決定酪术。(文章結(jié)尾源碼中可以查看)
計(jì)算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的大小,
//在自動(dòng)計(jì)算cell大小時(shí)翠储,textView的長寬都是0绘雁;
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
//根據(jù)textView的內(nèi)容,計(jì)算textView的大小
CGSize textViewSize = [cell.textView sizeThatFits:CGSizeMake([UIScreen mainScreen].bounds.size.width - 110, FLT_MAX)];
//由于textView不會(huì)影響size的大小援所,所以比較出一個(gè)最大的高度值庐舟。
CGFloat height = size.height + (textViewSize.height);
height = height > 109 ?height : 109;
return height + 1;
}
代碼中 height + 1 必不可少,不然某個(gè)控件的文字就顯示不出來住拭。因?yàn)閏ontentview的高度加上分割線的高度(1)才是Cell的高度挪略。
這里是實(shí)現(xiàn)動(dòng)態(tài)計(jì)算Cell高度的Demo地址:https://coding.net/u/hufeng/p/CellHeightDemo/git