UITableView滾動效能優化

2022-08-26 13:48:17 字數 2060 閱讀 3788

影響 uitableview 滾動的流暢性的原因

1、在**方法中做了過多的計算占用了 ui 執行緒的時間

2、cell裡的吃gpu(在tableview:cellforrowatindexpath:中

3、cell 中 view 的組織複雜

關於第一點,首先要明白 tableview 的**(這裡指 datasource 和 delegate 的那套方法,下同)方法的呼叫順序,和時機。對於一般的應用會有如下順序:

1、向**要 number of rows。

2、對於每行向**要 height for row at index path。

3、向**要 當前螢幕可見的 cell for row at index path 。(實測顯示4寸屏的手機會取 螢幕顯示數量+2,3.5寸屏同4寸屏數量,雖然3.5寸屏可顯示的cell 數量要小於 4寸屏!)

4、然後 cell 就顯示出來了。

tableview:heightforrowatindexpath:

很多人都把優化的重點放到了 cell for row at indexpath 那個方法裡了,在這裡盡可能的少計算,但是卻忽略了另乙個很輕鬆就能提公升載入時間的方法(盡可能的讓 height for row at index path這個方法的計算複雜度為 o(1)) :

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

tableview:cellforrowatindexpath:

說完了計算 cell 行高的優化,現在來談 tableview:cellforrowatindexpath: **的優化。優化思路同上,也是通過預處理減少在這個**中的計算時間。這個**重點談的是對非同步載入的優化。

非同步載入無非就是在這個方法裡發起非同步請求,載入完後根據 uiimageview 的引用設定。有經驗的程式設計師可能會使用 懶載入 的方式減少快速滑動時因為網路請求過於頻繁與切換執行緒顯示造成的卡頓。這裡還有個問題,拿回來的一定和最後顯示的大小不一樣,有時候偷懶,直接設定 image view 的 contentmode 屬性要 image view 自己 壓縮。這是乙個很取巧的方法,但是對 table view 的滾動速度也會造成 不容忽視 的影響。對變形需要對做 transform ,每次壓縮都要對乘以乙個變換矩陣,如果你的很多,這個計算量是不同忽視的。

優化建議:

1、與後台和ui的同事溝通,在ios端顯示的要是尺寸小的縮圖,而非原圖。

2、縮圖要不透明的png。(如果背景不是單一顏色的話,那就只好是透明背景的png,但這畢竟是極端少數的情況)

3、把cell以及cell裡面的view(例如uiimageview)設定為不透明,把opaque的值設定yes(xib就是把勾勾上)

4、如果與後台和ui同事溝通無果,

從網路摟回來都是很大的話,先根據需要顯示的大小切成合適大小的圖。

另外,有一種情況,後台不能返回圓角的,cell的需要做圓角,要自己畫的。通常我們先會想到類似下面的方法:

1 view.layer.cornerradius = 5

;2 view.layer.masktobounds = yes;

如果你的圓角檢視不多,cell 不複雜,的確用上面兩句就好。但實際工作中,多數是大量的cell,則效能的損耗是非常大的。

優化建議:

1、如果能夠只用 cornerradius 解決問題,就不用優化。 

2、如果必須設定 maskstobounds ,可以參考圓角檢視的數量,如果數量較少(一頁只有幾個)也可以考慮不用優化。 

3、uiimageview 的圓角通過直接擷取實現,其它檢視的圓角可以通過 core graphics 畫出圓角矩形實現。

1

extension uiimage

18 }

1

extension uiimageview

10 }

UITableView效能優化

uitableview效能優化 一直以來uitableview效能一直是個很嚴重的問題,uitableview效能優化的幾個關鍵點如下 1,盡量使用不透明的檢視。2,重用uitableviewcell。3,減少子檢視數量,自定義uitableviewcell,並在其drawrect 中自行繪製 更好...

UITableView效能優化

1.原理 uitableview是uiscrollview的子類,因此它可以自動響應滾動事件 一般為上下滾動 它內部包含0到多個uitableviewcell物件,每個table cell展示各自的內容。當新cell需要被顯示時,就會呼叫tableview cellforrowatindexpath...

UITableView獲取滾動的偏移

uitableview獲取滾動的偏移 nslog tableview滾動縱座標 f cardtableview.contentoffset.y 鍵盤擋住了要輸入的view時候,改變view的縱座標使其適應輸入 將鍵盤推出時候,view重新回到原來位置 nstimeinterval animation...