本文只介紹思路陈肛,具體代碼網(wǎng)上已經(jīng)有很多唆鸡,這里就不在粘貼了。希望正在閱讀的童鞋能理解思路脑慧,然后自己去實踐魄眉。
一:對于固定高度Cell的計算:
推薦:
tableView.rowHeight = 45;
不推薦:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
? ? return 45
}
二:對于動態(tài)高度Cell的計算:
1、手動計算
使用系統(tǒng)的boundingRect計算出文本的高度闷袒,然后:
Cell總高度 = 文本高度 + top距離 + bottom距離
對于高度計算復雜的Cell坑律,計算后將高度緩存在對應Cell的數(shù)據(jù)Model里。在heightForRow返回高度前囊骤,先判斷一下Model是否緩存高度晃择,如果有值,就直接返回淘捡。如果沒值藕各,就去計算,緩存焦除,下次直接使用激况。
2、自動計算
使用iOS8的新特性膘魄。
tableView.estimatedRowHeight = 45;// 設(shè)置一個預估高度
tableView.rowHeight = UITableViewAutomaticDimension;// 告訴系統(tǒng)要自動計算高度(可省略)
前提是你已經(jīng)給Cell設(shè)置好了完整的約束
對于 estimatedRowHeight 的值乌逐,可以設(shè)置得和所有 Cell 的平均值一樣,這樣TableView可以計算最少的cell
在 iOS8 中使用了 Cell 自動高度之后创葡,你會發(fā)現(xiàn)浙踢,只要一個 Cell 需要被顯示到屏幕上,它的高度都會被計算一次灿渴,即使這個 Cell 在之前的滑動中已經(jīng)被計算過高度了洛波。之所以被設(shè)計成這樣的原因系統(tǒng)認為 Cell 的高度是隨時可能改變的胰舆。
3、手動+"自動"
如果Cell中既有圖片蹬挤,又有文本缚窿,我們想手動計算圖片,自動計算文本(使用sizeToFit計算)焰扳。
第一步倦零、首先設(shè)置預估高度和自動計算:
tableView.estimatedRowHeight = 45;
tableView.rowHeight = UITableViewAutomaticDimension;
第二步、如果你設(shè)置了1中的代碼吨悍,那么tableview執(zhí)行時扫茅,會先執(zhí)行cellForRow而不是直接執(zhí)行heightForRow。此時你就可以在Cel賦值的代碼里計算高度育瓜,然后把高度緩存在對應Cell的Model里葫隙。
第三步、實現(xiàn)heightForRow代理爆雹,并返回在Cell里已經(jīng)緩存的高度停蕉。
sizeToFit 和 sizeThatFits 的使用區(qū)別
蘋果官方解釋
// return 'best' size to fit given size. does not actually resize view. Default is return existing view size
let size = contentLabel.sizeThatFits(CGSize(width: 200, height: CGFLOAT_MAX))
// calls sizeThatFits: with current view bounds and changes bounds size.
contentLabel.sizeToFit()
sizeToFit:讓view自動根據(jù)內(nèi)容計算自己的bounds,并且修改自己的bounds钙态。sizeToFit最后也是調(diào)用的sizeThatFits。
sizeThatFits:會計算出最優(yōu)的 size 但是不會改變 自己的 size