先說一下剛開始的實現思路吧,一開始使用的xib+autolayout,以及ios8之後的自動估算高度。也就是設定
self.ableview.estimatedrowheight = ***;
self.tableview.rowheight = uitableviewautomaticdimension;
選擇這種實現方式非常適合快速開發,快速的拖拽控制項就可以很快的看見效果。
如果能這麼順利的解決問題,那就不會有這篇部落格了。我們遇到的問題是,當切換到其他tabbaritem時,切換回首頁之後,滑動tableview之後發現掉幀,而且很嚴重。
這種問題其實是使用預估高度必然會出現的問題,預估的高度和實際高度不一致,當cell滑動時,會呼叫很多次計算高度的方法,不停的在計算,fps必然會低於60,也就產生了使用者所看到的跳幀。
解決思路:
快取高度。
self.ableview.estimatedrowheight的值設定螢幕最終顯示cell中實際高度最低的那個的高度值。
既然要快取高度,首先需要得到cell的真實高度
- (void)tableview:(uitableview *)tableview didenddisplayingcell:(uitableviewcell *)cell forrowatindexpath:(nsindexpath *)indexpath
didenddisplayingcell是cell已經被真正的顯示在了螢幕上,所以在這裡列印出的高度必然是最正確的高度。根據indexpath.row作為key,將高度快取進字典。拿字典做容器的好處還有就是取出速度更快。底層是用hash表實現的。如果有人對hash表想深入研究的話,推薦看這篇文章。
下面就是如果字典裡有值,則使用快取高度,否則自動計算。
- (cgfloat)tableview:(uitableview *)tableview heightforrowatindexpath:(nsindexpath *)indexpath
return uitableviewautomaticdimension;
}
tableview 去除footer高度
當uitableview的style為plain的時候,就會出現這種情況,解決辦法就是建立的時候選擇組的形式 tableview uitableview alloc initwithframe cgrectmake 0,0,screen width,self.view frame size heig...
tableView 刪除小技巧
滑動刪除 void tableview uitableview tableviewcommiteditingstyle uitableviewcelleditingstyle editingstyleforrowatindexpath nsindexpath indexpath 此時刪除按鈕為del...
計算tableView不等高cell高度的幾種方法
這裡利用heightforrowatindexpath 方法計算不等高cell的高度,在使用這個方法之前要明確這個方法的呼叫時間以及呼叫次數 返回cell的高度 cgfloat tableview uitableview tableview heightforrowatindexpath nsind...