類似朋友圈的評論列表做法-cell嵌套tableview

前言

因為項目是社交類項目,所以一般都會像朋友圈和微博這樣,每個人發(fā)的狀態(tài)下都可以被人評論或者點贊,由于每條狀態(tài)的評論數(shù)和點贊數(shù)都不一樣,所以這里的cell應(yīng)該做成動態(tài)高度,下面說一下我做的大概過程。

過程

做這樣一個動態(tài)高度的tableview,我覺得主要有三個重點:

  1. 計算cell的動態(tài)高度;
  2. 根據(jù)數(shù)據(jù)差異展示不同的評論列表;
  3. 就是結(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)鍵代碼:

vc關(guān)鍵代碼

cell關(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滾動起來十分流暢,體驗十分理想,如下圖:

4.gif

曲折

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

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

6.gif

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


在model中增加height參數(shù)保存高度

這個bug就解決了,如下圖

7.gif

效果很漂亮,有沒有?。?!哈哈~~

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

結(jié)束

學習之路,與君共勉。

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