UITableviewCell使用以及自定義高度

2021-06-28 21:02:36 字數 3344 閱讀 6892

uitableview號稱是 ios裡面最難使用也是最複雜的乙個控制項?

是不是暫且不說,反正我覺得httprequest也是挺複雜的。

但確實被uitableview折磨了一段時間,還好搞定了一小半。

一、如何重用uitableviewcell

重用的目的是為了減少記憶體消耗,假如有1千個cell,如果不重用,那麼每一次滑動都得重新

alloc 很多很多的cell,耗費記憶體,同時螢幕會出現不連續的現象,晃眼睛。

重用cell很簡單,在建立cell的時候,使用

alloc initwithtableviewcellstyle:reuseidentifer這個介面建立cell例項,而非使用alloc initwithframe

使用前者表示該cell可重用,identifer使用乙個固定的nsstring即可

**如下:

-(uitableviewcell*)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

else

return cell;

}

二、如何如何動態調整cell的高度?這個問題還是比較頭疼的,下面這個函式肯定要用到

-(cgfloat)tableview:(uitableview *)tableview heightforrowatindexpath:(nsindexpath *)indexpath

經過實踐之後發現,可以在建立cell或者重用cell的時候,設定其frame

比如cell.frame=cgrectmake(0,0,320,450);

這個**會有效,同時在下面這個函式裡面

使用:

-(cgfloat)tableview:(uitableview *)tableview heightforrowatindexpath:(nsindexpath *)indexpath

else

return 0;

}

上面獲取當前indexpath的cell例項會重新申請建立乙個例項(意思是個cell實際要建立兩個例項)

這樣的目的是為了獲取cell的frame,如果不這樣做也可以在第一部分建立cell的時候,將cell的frame儲存在乙個私有

變數中,在heightforrowatindexpath中訪問這個私有變數

通過上述方式可以動態改變uitableviewcell的高度

三、對於乙個uilabel,根據其內容計算cgrect

首先要設定uilable的font,比如

tmlabel.font=[uifont  systemfontofsize:14.0f];

然後使用boundingrectofsize計算出該尺寸對應的矩形大小,**如下:

nsdictionary *attrdic=@;

cgsize labelsize=[text boundingrectwithsize:cgsizemake(320, 990)

options:nsstringdrawinguseslinefragmentorigin|nsstringdrawingusesfontleading

attributes:attrdic context:nil].size;

cgrect labelrect=cgrectmake(0, 0, labelsize.width, labelsize.height);

現在uilable的rect都可以被計算出來了,那麼如果自定義乙個uitableviewcell,並且其內部的uilabel高度可變的話

也是可以實現的

四、內部含有可變高度的uilabel的uitableviewcell

如果還有其他控制項,比如uibutton等等,也是一樣的。

這些控制項在例項化的時候,設定frame為cgrectzero, 然後分別計算各自的高度和尺寸

使用cell.contentview addsubview 的方式,將這些子空間新增到cell中。重新計算cell的frame時

也需要把這些控制項的frame累加上。上**:

-(uitableviewcell*)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

else

uilabel *tmplabel=(uilabel *)[cell viewwithtag:1];

nsstring *text=[tmparray objectatindex:indexpath.row];

tmplabel.text=text;

uibutton *tmpbutton=(uibutton *)[cell viewwithtag:2];

nsdictionary *attrdic=@;

cgsize labelsize=[text boundingrectwithsize:cgsizemake(320, 990)

options:nsstringdrawinguseslinefragmentorigin|nsstringdrawingusesfontleading

attributes:attrdic context:nil].size;

cgrect labelrect=cgrectmake(0, 0, labelsize.width, labelsize.height);//計算uilabel的rect

[tmplabel setframe:labelrect];

[tmpbutton setframe:cgrectmake(0, labelsize.height+1, 100, 50)];//計算uibutton 子控制項的rect

[cell setframe:cgrectmake(0, 0, labelsize.width, labelsize.height+50+1)];//cell的frame是以上兩個子控制項之和

return cell;

}

為何不再建立時設定frame,而是在if和else邏輯後面?

重用cell的時候,從重用cell佇列裡面取出的cell,其內容(uilabel)是之前的cell內容,需要重新填充uilabel並且重新計算

整個cell的frame並設定其frame。而建立cell的時候也需要設定frame,所以這兩個邏輯重複,直接放在if else邏輯外面做。

下面是動態改變uitableviewcell的高度圖:

計算UITableViewCell高度

uitableview是先執行 cgfloat tableview uitableview tableview heightforrowatindexpath nsindexpath indexpath函式計算整個uitableview內容高度,然後才執行 uitableviewcell table...

UITableViewCell重用問題

在寫sina 微博介面的過程中使用到了cell,那麼就是在cell上新增一些控制項,但是由於每條微博的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。cpp view plain copy uitableviewcell tablevi...

UITableViewCell重用機制

uitableview是ios開發中使用頻率非常高的乙個控制項,它常被用來展示資訊列表,儘管資訊資料可能非常多,但uitableview消耗的資源卻並不會隨著展示資訊的增多而變大,這都要得益於uitableviewcell的重用機制,重用機制 顧名思義,就是反覆利用資源的機制。以下通過一些 來看下通...