最近在開發(fā)遇到cell高度不確定的情況乏盐,主要原因是cell里面的label的高度是不確定童谒。從而導(dǎo)致cell高度不確定肄扎。
我找到了兩種解決方案纫溃。第一種 利用iOS8的新特性腰涧,自動(dòng)計(jì)算cell的高度。第二種 自己計(jì)算每個(gè)cell的高度紊浩。
下面我們來一個(gè)一個(gè)演示:
第一種方法:利用iOS7 的新特性
首先我們先創(chuàng)建一個(gè)tableView:
大家注意 :tableView.estimatedRowHeight=44.0;
tableView.rowHeight=UITableViewAutomaticDimension;//高度設(shè)置為自適應(yīng)
這兩行代碼就是把tableView 的高度設(shè)置為自適應(yīng)的了
注意:如果tableView rowHight設(shè)置為自適應(yīng)窖铡,那么就需要在代理里面設(shè)置cell的高度了,換而言之坊谁,就是不用再調(diào)用-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 這個(gè)方法费彼。
接下來的問題來了,它是怎么計(jì)算cell的高度呢口芍,它是根據(jù)布局來計(jì)算的箍铲。
我們把高度不確定的label的高度 設(shè)置為大于等于當(dāng)前高度,并且把label的行數(shù)設(shè)置為0
這樣鬓椭,label的行數(shù)就是無限行颠猴,label的高度就可以隨著行數(shù)的變化而變化。
還有一點(diǎn)需要注意的小染,系統(tǒng)計(jì)算cell的高度翘瓮,必須要知道,當(dāng)前cell 內(nèi)控件的高度及cell控件之間豎直之間的距離氧映,所以春畔,在布局的時(shí)候下圖的約束必須要加的。不然高度計(jì)算會(huì)不對(duì)。
這是第一種方法律姨。
第二種方法振峻,我當(dāng)初的想法是,在-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 的方法里直接遍歷cell里面的控件择份,拿到cell控件的高度扣孟,計(jì)算cell的高度。
?然而這種方法是不可行的荣赶。理由如下:heightForRowAtIndexPath這個(gè)代理方法凤价,在(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 這個(gè)代理方法前調(diào)用,所以壓根取不到當(dāng)前的cell,cell壓根沒有創(chuàng)建,會(huì)導(dǎo)致崩潰拔创。
于是我就換了一種方法利诺,把計(jì)算高度的方法寫在model里面。
每個(gè)model對(duì)應(yīng)一個(gè)cell ,每個(gè)model里面都包含cell控件的值剩燥,我在model里面添加計(jì)算高度的方法慢逾。
我們?cè)趺创_定cell的高度,我們來分析一下灭红,cell的高度 = titleLabel的上邊距 + titleLabel的高度 +titleLabel的下邊距 + descLabel的高度 + descLabel的下邊距侣滩。
現(xiàn)在唯一不確定的是descLabel的高度,因?yàn)樗母叨仁强勺兊谋淝埽晕覀冎灰?jì)算他的高度君珠,在加上其他已經(jīng)確定的值就好了。
那么 怎么計(jì)算descLabel的高度呢娇斑。 根據(jù) boundingRectWithSize這個(gè)方法策添,根據(jù)lable的字體大小,計(jì)算出label的高度悠菜。
接下來舰攒,在-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 方法里 取出每個(gè)cell的高度。
第二種方法完成了悔醋。