tableView滑動(dòng)的時(shí)候卡頓現(xiàn)象解決

我找了很多的文檔看原因,最后自己解決了 ,不過(guò)感覺(jué)這個(gè)還是很有用的:

1.UITableViewCell重用機(jī)制?

UITableView只會(huì)創(chuàng)建一屏幕(或者一屏幕多一點(diǎn))的cell,其他都是取出來(lái)重用的。每當(dāng)cell滑出屏幕的時(shí)候,就會(huì)放到一個(gè)集合中,當(dāng)要顯示某一位置的cell時(shí),會(huì)先去集合中取,有的話,就直接拿出來(lái)顯示,沒(méi)有在創(chuàng)建。

2.tableView滑動(dòng)為什么會(huì)卡頓?

cell賦值內(nèi)容時(shí),會(huì)根據(jù)內(nèi)容設(shè)置布局,也就可以知道cell的高度,若有1000行,就會(huì)調(diào)用1000次 cellForRow方法,而我們對(duì)cell的處理操作,都是在這個(gè)方法中賦值,布局等等,開(kāi)銷(xiāo)很大。

3.優(yōu)化方法?

3.1優(yōu)化:heightForRow方法處理cell高度。

思路:賦值和計(jì)算布局分離。cellForRow負(fù)責(zé)賦值,heightRorRow負(fù)責(zé)計(jì)算高度。

3.2自定義cell繪制:

各個(gè)信息都是根據(jù)之前算好的布局進(jìn)行繪制的。需要異步繪制。重寫(xiě)draeRect方法就不需要異步繪制了,因?yàn)閐rawRect本來(lái)就是異步繪制的。圖文混排的繪制,coreText繪制。

3.3按需加載(UIScrollView方面):

如果目標(biāo)行與當(dāng)前行相差超過(guò)指定行數(shù),只在目標(biāo)滾動(dòng)范圍的前后制定n行加載。滾動(dòng)很快時(shí),只加載目標(biāo)范圍內(nèi)得cell,這樣按需加載,極大地提高了流暢性。

4.總結(jié)

1.提前計(jì)算并緩存好高度,因?yàn)閔eightForRow最頻繁的調(diào)用。

2.異步繪制,遇到復(fù)雜界面,性能瓶頸時(shí),可能是突破口。

3.滑動(dòng)時(shí)按需加載,這個(gè)在大量圖片展示,網(wǎng)絡(luò)加載時(shí),很管用。(SDWebImage已經(jīng)實(shí)現(xiàn)異步加載)。

4.重用cells。

5.如果cell內(nèi)顯示得內(nèi)容來(lái)自web,使用異步加載,緩存結(jié)果請(qǐng)求。

6.少用或不用透明圖層,使用不透明視圖。

7.盡量使所有的view opaque,包括cell本身。

8.減少subViews

9.少用addView給cell動(dòng)態(tài)添加view,可以初始化的時(shí)候就添加,然后通過(guò)hide控制是否顯示。


上面是我找到的一個(gè)文檔,感覺(jué)很有啟發(fā),自己記錄一下。

但是我的卡頓原因是以為在tableView那個(gè)頁(yè)面本來(lái)已經(jīng)有了一個(gè)請(qǐng)求了,但是還有圖片的請(qǐng)求用的原生的方法,導(dǎo)致了卡頓現(xiàn)象,最后把這個(gè)方法改成第三方框架(SDWebImage)加載后瞬間好了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容