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的重用機制,重用機制 顧名思義,就是反覆利用資源的機制。以下通過一些 來看下通...