本教程適合新手.
- 系統(tǒng):IOS7之后.
- 純文本高度.
血的教訓(xùn):
相信大家曾經(jīng)為了實現(xiàn)cell的高度自適應(yīng),肯定少苦身冀。那個時候钞楼,我是在我的數(shù)據(jù)模型model中添加一個height屬性惑惶,實現(xiàn)它的get方法,在get方法中計算需要多行顯示文字的高度圆凰,然后再加上其他亂七八糟的高度并返回,然后在tableview的 - (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath
中獲取到每行對應(yīng)的model体箕,取出其中的model.height屬性的值返回专钉,還要在cell中確定cell中l(wèi)abel的高度。干旁。驶沼。總之就是很麻煩争群,而且還不一定總能算的很正確回怜,甚是受此困擾。
柳暗花明:
我一直想,這種笨方法肯定有更簡單的方法取代,終于有一天我google一番之后發(fā)現(xiàn)了一個好方法.只要你懂一定的Autolayout知識的話换薄,原來實現(xiàn)這種的cell高度自適應(yīng)玉雾,其實是非常非常簡單的:
-
現(xiàn)在自定義的cell中將高度隨著內(nèi)容動態(tài)改變的label的布局使用autolayout布局完成,這里有個注意點就是label和cell邊界的距離要確定好,不能固定死label的高度.
然后設(shè)置label的numberOfLines=0轻要,行數(shù)設(shè)置為0即意味著label可以有任意行复旬。
實現(xiàn)以下兩個tableview的delegate中的方法:
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
是的,只要實現(xiàn)這兩個方法冲泥,然后運行你的項目驹碍,你會驚訝的發(fā)現(xiàn)壁涎,哇塞,高度完美自適應(yīng)…
這里有兩個關(guān)鍵點:
關(guān)鍵點1:必須重寫estimatedHeightForRowAtIndexPath
方法 這個方法是iOS7.0之后才出現(xiàn)的志秃,如果不重寫此方法怔球,僅重寫heightForRowAtIndexPath
,那么大家會發(fā)現(xiàn)浮还,cell并不會根據(jù)label的內(nèi)容竟坛,自適應(yīng)高度。因為系統(tǒng)是先獲取cell的高度钧舌,再獲取cell的view担汤。也就是先調(diào)用heightForRowAtIndexPath
,再調(diào)用cellForRowAtIndexPath
洼冻。
在cellForRowAtIndexPath
被調(diào)用之前崭歧,你的label是沒有被設(shè)置文本內(nèi)容的,因此它獲取到的高度碘赖,并不是你想要的驾荣。那么我們必須想辦法讓系統(tǒng)在獲取了cell之后,再獲取cell的高度普泡。方法就是播掷,重寫estimatedHeightForRowAtIndexPath,顧名思義撼班,它會返回一個估計高度歧匈,有了這個方法后,tableview會先調(diào)用它獲取估計高度砰嘁,然后獲取cell件炉,最后獲取真實高度。
estimatedHeightForRowAtIndexPath
的返回值可以隨意矮湘,返回多少都可以斟冕,只是給tableview一個安慰而已,讓它延遲獲取真實的高度缅阳。
關(guān)鍵點2:真實高度返回值為
UITableViewAutomaticDimension
Demo地址:https://github.com/yuying2012/WJDStudyLibrary
這是一個大工程,請從工程中尋找相關(guān)模塊代碼.