TableViewCell動態(tài)布局

在實際工作中,一個tableView中的cell根據(jù)數(shù)據(jù)的內(nèi)容確定高度是很常見的一種形式,而且我們處理的方式也不一樣。我喜歡用xib構(gòu)建tableView的cell,以下是我自己總結(jié)的一些關(guān)于xib的常見的處理方法。

一個cell上面只有一個label

這是cell高度動態(tài)布局中最簡單的一種方式,在layout出來之前我一直用這種方式計算得到cell的高度

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{    
 TestModel * model = self.dataArr[indexPath.row];
 CGFloat height = [model.title  boundingRectWithSize:CGSizeMake(200, 1000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15]} context:nil].size.height;
return height + 10 + 10;

}

雖然這種方式也可以實現(xiàn)同樣的效果,但是很明顯他不符合autolayout思想,我們不能每次需要高度的時候都要手動算一次高度。經(jīng)過查閱網(wǎng)上相關(guān)資料發(fā)現(xiàn),蘋果其實已經(jīng)給出來這里計算cell高度的相關(guān)辦法

TestModel * model = self.dataArr[indexPath.row];
TableViewCell1 * cell1 = [tableView dequeueReusableCellWithIdentifier:CELL_NAME1];
self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
cell1.lblContent.text = model.title
CGSize size = [cell1.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]
return size.height + 0.5;

如果你是第一次接觸這個方法你肯定對+0.5感到好奇,但是別小看這里的0.5,如果你不加,你最后一行顯示很可能會不準(zhǔn)確,這是什么原因造成的呢?打印下cell.frame,和cell.contentView.frame,你肯定會發(fā)現(xiàn)cell比cell.contentView高度大0.5。

如果你很不習(xí)慣+0.5才能得到正確的高度,那么你將cell.contentView寫成cell,如代碼:

TestModel * model = self.dataArr[indexPath.row];
TableViewCell1 * cell1 = [tableView dequeueReusableCellWithIdentifier:CELL_NAME1];
self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
cell1.lblContent.text = model.title
CGSize size = [cell1 systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]
return size.height;

然后運行,界面顯示的結(jié)果確實呈現(xiàn)了我們所想要的結(jié)果。

一個cell上面有上下兩個label

這種情況和只有一個label的情況稍有不同。看代碼

TestModel * model = self.dataArr[indexPath.row];
TableViewCell2 * cell2 = [tableView dequeueReusableCellWithIdentifier:CELL_NAME2];
self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
self.titleLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
cell2.lblContent.text = model.title
CGSize size = [cell2 systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]
return size.height;

然后運行,界面顯示的結(jié)果確實呈現(xiàn)了我們所想要的結(jié)果,但是先別急,我們看看打印信息,此時會發(fā)現(xiàn)有一大堆約束沖突,我看了里面的一些相關(guān)報錯,刪除了一些約束都不生效,很懊惱。不過隨后我在網(wǎng)上查到了相關(guān)資料,其實只需要將UILayoutFittingCompressedSize改成UILayoutFittingExpandedSize,再重新運行,沒有約束沖突了,結(jié)果也很完美。如果我們用cell.contentView,或者一個label和兩個label的做法基本相似。

到此為止基本比較常xib動態(tài)布局基本上講完了,但是我們應(yīng)該還不夠滿意吧,畢竟用起來還挺復(fù)雜,而且一不小心就容易出錯,很幸運的是有大神早已經(jīng)封裝好了一些第三方庫。UITableView+FDTemplateLayoutCell這個庫就可以很方便的處理cell高度的相關(guān)問題,他適用storyboard,xib和純代碼。我們可以用以下代碼計算出相應(yīng)的高度

return [tableView fd_heightForCellWithIdentifier:CELL_NAME3 configuration:^(TableViewCell3 * cell) {
    [cell setModel:self.dataArr[indexPath.row]];
}];

DEMO下載
這篇文字是我自己學(xué)習(xí)autolayout的一個筆記記錄,在學(xué)習(xí)的過程中因為一直摒棄不了相對布局的思想,因此走了很多彎路,通過一些文字記錄自己學(xué)習(xí)的過程,另外如果文章中有些不準(zhǔn)確的地方,歡迎大家指出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容