iOS 給tableView 每行設(shè)置預(yù)估行高estimatedRowHeight,達到cell高度的自適應(yīng)

在iOS8之后蘋果推出的一個新特性Self Sizing Cells,意思就是讓cell自己計算自己的高度,當(dāng)我們在cell里面添加完所需控件,并約束好位置之后,我們只需要設(shè)置

tableView.estimatedRowHeight = 44.0f;//推測高度,必須有,可以隨便寫多少

tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默認(rèn)就是這個值,可以省略

這兩句代碼之后,即可放心的往cell的控件里面加上內(nèi)容,cell會根據(jù)內(nèi)部所有控件的高度動態(tài)的計算自己的高度從而顯示出來。這個就有點類似于html5中的body,會根據(jù)自己內(nèi)部的內(nèi)容調(diào)整自己的大小。這就給iOS開發(fā)者提供了很大的便利,不再需要之前復(fù)雜的自適應(yīng)計算方法。但是要注意的是,這個需要在iOS8之后才可以使用,如果你的應(yīng)用要適配iOS8之前的版本,可能無法使用該機制,當(dāng)然也可以對系統(tǒng)版本進行判斷之后再決定使用哪一套適配方案。

介紹cell子控件如何autolayout

我查了一些資料是這樣說的模板單元格中,subviews的自動局部必須要能夠把單元格撐滿。也就是說,iOS 必須能夠通過內(nèi)容的自動布局約束計算出 cell 的高。但是以我的理解,必須保證cell中子控件在一條Y軸上有自上而下所有的約束,我這么說可能不太理解,我來個迷之畫圖吧


WechatIMG2.jpeg

如圖,我們要對這個cell的高度做自適應(yīng),很明顯,可變動的就是label1或者label2這個控件,OK,那我剛才所說的Y軸方向的約束指的是什么呢? 我們從上向下看,就是子控件的Y值和子控件的高度還有最下面一個子控件的底部到cell底部的距離,這些條件滿足,我們才能讓cell的高度"有據(jù)可循",當(dāng)然一些控件的其他約束也要添加完好..

好,我們來假設(shè)一個場景吧,李菊福一波,還是上圖的cell,imageview是頭像,label1是昵稱,label2是評價的內(nèi)容,可能很長需要換行等等,所以這就要求我們的cell需要在特定是的數(shù)據(jù)面前"各不相同"..

一般來說,imageView給這些約束就差不多(不在主要討論范圍)


WechatIMG3.jpeg

我們給label1也來個約束


WechatIMG4.jpeg

相對與imageView的top


WechatIMG5.jpeg

來個equalTop

那我們來看看label2(這是我的約束習(xí)慣勿噴),你寬度寫死也是ok的


WechatIMG6.jpeg

因為label2的高度不固定,所以numberOfLines = 0不多說,我們還要對他高度的約束做一個小小的設(shè)置如下圖,讓laebl2的高度大于等于原來的高度


WechatIMG7.jpeg

這樣我們就擁有了Y軸所有的約束,我們下面我們來盤點下

cell高度 = imageViewY值(label1Y值) + label1高度 + label2top距離label1bottom間距

+ label2高度(不確定,數(shù)據(jù)很多會變化,大于等于原設(shè)置的高度) + label2bottom距離bellbottom的間距

我們這樣一番折騰后,cell子控件的Y軸方向的所有約束全部搞定了,然后我們按照自己的套路去給cell的子控件賦值數(shù)據(jù)什么的就可以了,別忘了給tableView設(shè)置文章一開頭設(shè)置的那兩句話,這樣我們的cell就做到了自適應(yīng)的高度,我文章中舉的例子非常簡單,我相信大家再公司的項目中cell要復(fù)雜的多,只要遵循Y軸方向的約束全部滿足就可以了

最后編輯于
?著作權(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)容