這篇文章主要用于兼容iOS7系統(tǒng),在iOS8以上直接一句代碼系統(tǒng)就可以幫你算出cell的高度,有興趣的朋友可以自己搜下。以下列出這個(gè)例子的代碼流程
常規(guī)的創(chuàng)建一個(gè)控制器帶一個(gè)tableview視圖,在控制器.m文件中傳遞模型數(shù)據(jù),這里注意下:在模型中加入一個(gè)存儲(chǔ)cell高度的屬性用于緩存cell高度,增強(qiáng)視圖滑動(dòng)的流暢性。
-
通過xib自定義一個(gè)cell,在這個(gè)例子中的cell上加一個(gè)UILabel,并設(shè)置上下左右的約束。
cell的內(nèi)部約束 在cell中有一個(gè)很重要的操作,UILable多行時(shí)必須設(shè)置preferredMaxLayoutWidth屬性,不然系統(tǒng)無法確定UILabel的寬度
self.aLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width-16;
- 實(shí)現(xiàn)tableview代理方法1,這個(gè)方法可以避免一初始化控制器系統(tǒng)就計(jì)算全部cell的高度,消耗資源,使用這個(gè)方法好處就是系統(tǒng)只會(huì)先算顯示在屏幕的cell高度.
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
- 實(shí)現(xiàn)代理方法2,這個(gè)是重頭戲,主要用到systemLayoutSizeFittingSize:這個(gè)方法就可以得到cell的高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (_prototyCell == nil) {
_prototyCell = [tableView dequeueReusableCellWithIdentifier:@"Custom"];
}
DataEntity *dataEntity = self.dataSource[indexPath.row];
if (dataEntity.cellH<=0) {
_prototyCell.aLabel.text = dataEntity.title;
dataEntity.cellH = [_prototyCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height+0.5;
}
return dataEntity.cellH;
}
寫這篇文章是為了記錄自己學(xué)習(xí)這個(gè)的過程,學(xué)習(xí)這個(gè)主要是在這里看到lishichao706的專欄,這個(gè)作者寫得很詳細(xì),有興趣可以去看看
