不要重複建立沒必要要的table cell
前面說了,UITableView只須要一屏幕的UITableViewCell對象便可。所以在cell不可見時,能夠將其緩存起來,而在須要時繼續使用它便可。
而UITableView也提供了這種機制,只須要簡單地設置一個identifier便可:git
1 |
static NSString *CellIdentifier = @"xxx"; |
不要作多餘的繪製工做。
在實現drawRect:的時候,它的rect參數就是須要繪製的區域,這個區域以外的不須要進行繪製。
例如上例中,就能夠用CGRectIntersectsRect、CGRectIntersection或CGRectContainsRect判斷是否須要繪製image和text,而後再調用繪製方法。github
下面是轉載於 BLOG: SUNNYXX – 優化UITableViewCell高度計算的那些事
他們也在維護一個開源的擴展,UITableView+FDTemplateLayoutCell,讓高度計算這個事情變的史無前例的簡單,也受到了不少星星的支持,github連接請戳我緩存
rowHeightide
UITableView
是咱們再熟悉不過的視圖了,它的 delegate 和 data source 回調不知寫了多少次,也難免遇到 UITableViewCell 高度計算的事。UITableView 詢問 cell 高度有兩種方式。
一種是針對全部 Cell 具備固定高度的狀況,經過:工具
1 |
self.tableView.rowHeight = 88; |
上面的代碼指定了一個全部 cell 都是 88 高度的 UITableView,對於定高需求的表格,強烈建議使用這種(而非下面的)方式保證沒必要要的高度計算和調用。rowHeight屬性的默認值是 44,因此一個空的 UITableView 顯示成那個樣子。優化
另外一種方式就是實現 UITableViewDelegate
中的:ui
1 |
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { |
須要注意的是,實現了這個方法後,rowHeight
的設置將無效。因此,這個方法適用於具備多種 cell 高度的 UITableView。spa
estimatedRowHeight
這個屬性 iOS7 就出現了, 文檔是這麼描述它的做用的:設計
If the table contains variable height rows, it might be expensive to calculate all their heights when the table loads. Using estimation allows you to defer some of the cost of geometry calculation from load time to scrolling time.code
恩,聽上去蠻靠譜的。咱們知道,UITableView 是個 UIScrollView,就像平時使用 UIScrollView
同樣,加載時指定 contentSize 後它才能根據本身的 bounds、contentInset、contentOffset 等屬性共同決定是否能夠滑動以及滾動條的長度。而 UITableView 在一開始並不知道本身會被填充多少內容,因而詢問 data source 個數和建立 cell,同時詢問 delegate 這些 cell 應該顯示的高度,這就形成它在加載的時候浪費了多餘的計算在屏幕外邊的 cell 上。和上面的 rowHeight
很相似,設置這個估算高度有兩種方法:
1 |
self.tableView.estimatedRowHeight = 88; |
有所不一樣的是,即便面對種類不一樣的 cell,咱們依然可使用簡單的 estimatedRowHeight
屬性賦值,只要總體估算值接近就能夠,好比大概有一半 cell 高度是 44, 一半 cell 高度是 88, 那就能夠估算一個 66,基本符合預期。
使用UITableView+FDTemplateLayoutCell
無疑是解決算高問題的最佳實踐之一,既有 iOS8 self-sizing 功能簡單的 API,又能夠達到 iOS7 流暢的滑動效果,還保持了最低支持 iOS6。
使用起來大概是這樣:
<uitableview+fdtemplatelayoutcell.h>
1 |
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [tableView fd_heightForCellWithIdentifier:@"identifer" cacheByIndexPath:indexPath configuration:^(id cell) {
// 配置 cell 的數據源,和 "cellForRow" 乾的事一致,好比:
cell.entity = self.feedEntities[indexPath.row];
}];
} |
寫完上面的代碼後,你就已經使用到了:
-dequeueCellForReuseIdentifier:
方法 lazy 建立並保存,因此要求這個 ReuseID 必須已經被註冊到了 UITableView 中,也就是說,要麼是 Storyboard 中的原型 cell,要麼就是使用了 UITableView 的 -registerClass:forCellReuseIdentifier:
或 -registerNib:forCellReuseIdentifier:
其中之一的註冊方法。-systemLayoutSizeFittingSize:
若是你以爲這個工具能幫獲得你,整合到工程也十分簡單。
使用 cocoapods:
1 |
pod search UITableView+FDTemplateLayoutCell |
歡迎使用和支持這個工具,有 bug 請隨時反饋哦~
再複習下 github 地址: https://github.com/forkingdog/UITableView-FDTemplateLayoutCell