前言
因為項目是社交類項目,所以一般都會像朋友圈和微博這樣,每個人發(fā)的狀態(tài)下都可以被人評論或者點贊,由于每條狀態(tài)的評論數(shù)和點贊數(shù)都不一樣,所以這里的cell應(yīng)該做成動態(tài)高度,下面說一下我做的大概過程。
過程
做這樣一個動態(tài)高度的tableview,我覺得主要有三個重點:
- 計算cell的動態(tài)高度;
- 根據(jù)數(shù)據(jù)差異展示不同的評論列表;
- 就是結(jié)合tableview的重用機制保證效率和流暢度。
剛接手項目時,上一個人已經(jīng)大概做好了這個評論列表:
計算高度時,先在- (CGFloat)tableView:(UITableView )tableView
heightForRowAtIndexPath:(NSIndexPath )indexPath這個方法初始化cell賦值并且計算高度,再作緩存**,如下:
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
QuestionModel *model = tableData[indexPath.row];
if (model.height == 0.0) {
//只創(chuàng)建一個cell用作測量高度
static AttentionCell *cell = nil;
if (!cell){
cell = [self.tableView
dequeueReusableCellWithIdentifier:[AttentionCell cellIdentifier]];
}
cell.isForHeight = 1;
cell.cellData = model;
model.height = [self getCellHeight:cell];
return model.height;
} else {
return model.height;
}
}
然后在- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath的方法又重新初始化賦值,如下:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
AttentionCell *cell = [tableView
dequeueReusableCellWithIdentifier:[AttentionCell cellIdentifier]];
if (!cell) {
cell = [[[NSBundle mainBundle] loadNibNamed:[AttentionCell cellIdentifier]
owner:nil
options:nil] lastObject];
}
cell.cellData = [tableData objectAtIndex:[indexPath row]];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
至于在評論列表的布局,則是根據(jù)數(shù)據(jù)逐個控件添加,每添加一個控件,都要設(shè)置好約束,是不是聽起來很驚悚?。?!有木有?。?!如下圖:

因此以上的做法加載時偏慢,tableview的效率較低,而且一旦評論列表的數(shù)量比較多時,tableview的上下滾動就會出現(xiàn)卡頓現(xiàn)象,嚴重影響體驗。
于是在網(wǎng)上搜索類似的做法時,我搜到了這位大神的文章Cell中嵌套TableView自動布局,做法就是在cell中再嵌套一個tableview展示評論列表,于是我結(jié)合同事最近教我的一種簡便計算cell高度的方法和這種思路,做了一個demo--GitHub地址,下面簡單介紹下:
vc關(guān)鍵代碼:

cell關(guān)鍵代碼:

以上這種計算存儲cell高度的方法是最近同事教,我以前也沒用過,看起來也覺得挺簡單的,在cell中預(yù)設(shè)一個靜態(tài)變量存儲高度值,當tableview運行heightForRowAtIndexPath的方法時,先返回預(yù)設(shè)的靜態(tài)高度,當在cellForRowAtIndexPath的方法把數(shù)據(jù)賦值后再算出最終高度并賦給這個靜態(tài)變量。
用cell嵌套tableview做出來的評論列表,tableview滾動起來十分流暢,體驗十分理想,如下圖:

曲折
- 靜態(tài)初始值為0時,tableview初始加載顯示的不是第一個cell,如下圖


2.新增評論時,更新高度時tableview會滾動,如下圖:

后來我把heightForRowAtIndexPath方法里的代碼改成以下:

這個bug就解決了,如下圖

效果很漂亮,有沒有?。?!哈哈~~
造成這兩bug的原因,我覺得應(yīng)該是和這種靜態(tài)變量存儲cell高度的方法有關(guān),這種方法我是才剛接觸,以上的解決辦法都是我慢慢探索出來,但是真正的原因我還沒找到,衷心希望知道原因的猿和媛能夠給出指導意見,我的郵箱在個人主頁上可以看到,又或者可以在文章下評論。
最后再獻上demo的GitHub地址
結(jié)束
學習之路,與君共勉。