本文圍繞以下幾點展開tableView性能優化的論述?
1.UITableViewCell重用機制?
2.tableView滑動為什么會卡頓?
3.優化方法?
4.總結
1.UITableViewCell重用機制?
UITableView只會創建一屏幕(或者一屏幕多一點)的cell,其他都是取出來重用的。每當cell滑出屏幕的時候,就會放到一個集合中,當要顯示某一位置的cell時,會先去集合中取,有的話,就直接拿出來顯示,沒有在創建。
2.tableView滑動為什么會卡頓?
cell賦值內容時,會根據內容設置布局,也就可以知道cell的高度,若有1000行,就會調用1000次 cellForRow方法,而我們對cell的處理操作,都是在這個方法中賦值,布局等等,開銷很大。
3.優化方法?
3.1優化:heightForRow方法處理cell高度。
思路:賦值和計算布局分離。cellForRow負責賦值,heightRorRow負責計算高度。
3.2自定義cell繪制:
各個信息都是根據之前算好的布局進行繪制的。需要異步繪制。重寫draeRect方法就不需要異步繪制了,因為drawRect本來就是異步繪制的。圖文混排的繪制,coreText繪制。
3.3按需加載(UIScrollView方面):
如果目標行與當前行相差超過指定行數,只在目標滾動范圍的前后制定n行加載。滾動很快時,只加載目標范圍內得cell,這樣按需加載,極大地提高了流暢性。
4.總結
1.提前計算並緩存好高度,因為heightForRow最頻繁的調用。
2.異步繪制,遇到復雜界面,性能瓶頸時,可能是突破口。
3.滑動時按需加載,這個在大量圖片展示,網絡加載時,很管用。(SDWebImage已經實現異步加載)。
4.重用cells。
5.如果cell內顯示得內容來自web,使用異步加載,緩存結果請求。
6.少用或不用透明圖層,使用不透明視圖。
7.盡量使所有的view opaque,包括cell本身。
8.減少subViews
9.少用addView給cell動態添加view,可以初始化的時候就添加,然后通過hide控制是否顯示。