一款優(yōu)秀的App,讓用戶有更好的體驗(yàn)效果,如何做好tableView的優(yōu)化將是很重要的一環(huán).
- 要保證滾動(dòng)tableView時(shí),讓用戶有良好的體驗(yàn)阵面,需要確保刷新幀率應(yīng)該在 50+/s 才可以嘱腥!(instrument中CoreAnnimation中可查看)
- 不能因?yàn)閏ell展示不必要的內(nèi)容浪費(fèi)時(shí)間,出現(xiàn)跳幀現(xiàn)象,導(dǎo)致畫面不連續(xù),也就是說在兩幀刷新之間,表格的運(yùn)算必須做完.
- 一句話:要想滾動(dòng)tableView時(shí),能夠非常流暢,最關(guān)鍵的是在創(chuàng)建cell或者從緩存池取cell時(shí),讓系統(tǒng)花費(fèi)最少的時(shí)間,即盡可能的減少顯示cell的計(jì)算量.
tableView的性能優(yōu)化可以從下面幾個(gè)方面著手:
1. 行高一定要緩存C嗷肌G梅尤!
2. 不要?jiǎng)討B(tài)創(chuàng)建子視圖
3. 所有的子視圖都應(yīng)該添加到 contentView 上
4. 所有的子視圖都必須指定背景顏色
5. 所有的顏色都不要使用 alpha
6. cell 柵格化
7. 異步繪制
8. tableview加載圖片的時(shí)候使用lazy(懶加載)模式和異步加載模式
9. 正確使用reuseIdentifier來重用Cells
講解
1:行高要緩存
- 舉個(gè)簡(jiǎn)單的例子: 如果現(xiàn)在要顯示100個(gè)Cell,當(dāng)前屏幕顯示5個(gè)埂淮。那么全局刷新UITableView時(shí), UITableView會(huì)先調(diào)用100次tableView:heightForRowAtIndexPath:方法,然后調(diào)用5次 tableView:cellForRowAtIndexPath:方法;
- 滾動(dòng)屏幕時(shí),每當(dāng)Cell滾入屏幕,都會(huì)調(diào)用 一次tableView:heightForRowAtIndexPath:和tableView:cellForRowAtIndexPath:方 法慨畸。
- 所以說要提前計(jì)算并緩存好高度,因?yàn)閔eightForRowAtIndexPath:是調(diào)用最頻繁的方法,如果是使用MVVM搭建框架,可以在viewModel中添加行高屬性,提前計(jì)算好行高.
2:不要?jiǎng)討B(tài)創(chuàng)建子視圖
意思是:cell所有的子視圖都預(yù)先在初始化方法中創(chuàng)建,如果根據(jù)實(shí)際情況不需要顯示的可以設(shè)置 hidden.這樣能盡可能的減少cell創(chuàng)建或從緩存池取時(shí)因?yàn)椴季肿涌丶牡臅r(shí)間.
3:所有的子視圖都應(yīng)該添加到 contentView 上
這一條和tableView的性能優(yōu)化其實(shí)沒多少關(guān)系,但添加到contentView中,當(dāng)側(cè)滑cell需要?jiǎng)h除或編輯這行數(shù)據(jù)時(shí)更好操作.
4:所有的子視圖都必須指定背景顏色
相信很多程序員在開發(fā)時(shí)經(jīng)常會(huì)遇到這種情況,當(dāng)從某個(gè)控制器A跳轉(zhuǎn)到下一個(gè)控制器B時(shí),若B控制器的view未設(shè)置背景顏色,跳轉(zhuǎn)時(shí)會(huì)有卡頓現(xiàn)象,cell也一樣,若控件未指定背景顏色,會(huì)影響tableView滾動(dòng)的流暢度.
5:所有的顏色都不要使用 alpha
因?yàn)榭丶缬型该鞫?會(huì)顯示底部控件的部分輪廓,系統(tǒng)在顯示cell時(shí),需要計(jì)算各控件間的疊加面積,顏色的透明度等;但如果所有控件顏色不透明,則不需要耗費(fèi)性能去計(jì)算,能節(jié)省大量時(shí)間.
6:cell 柵格化 柵格化,
是UI設(shè)計(jì)師的術(shù)語(yǔ):是將 cell 中的所有內(nèi)容蛛蒙,生成一張獨(dú)立的圖像,在屏幕滾動(dòng)時(shí)糙箍,只顯示圖像 設(shè)置屬性 self.layer.shouldRasterize = YES;即可 柵格化的同時(shí)必須指定分辨率,否則默認(rèn)使用 1倍的scale 生成圖像牵祟! 需要設(shè)置 self.layer.rasterizationScale = [UIScreen mainScreen].scale;
7:異步繪制 異步繪制深夯!
如果 cell 比較復(fù)雜,可以設(shè)置cell圖層的屬性 self.layer.drawsAsynchronously = YES;
8:tableview加載圖片的時(shí)候使用lazy(懶加載)模式和異步加載模式
舉個(gè)栗子,當(dāng)我們?cè)谟眯侣勵(lì)惖腁pp時(shí),滑動(dòng)cell時(shí)看新聞時(shí),并不是所有的都是我們感興趣的,有時(shí)候我們只是很快的滑過,想要快速的略過不喜歡的內(nèi)容,但實(shí)際上只要滑動(dòng)經(jīng)過了的cell中的圖片就開始加載了,這樣用戶使用起來會(huì)出現(xiàn)不同程度的卡頓,用戶體驗(yàn)不太好,而且浪費(fèi)內(nèi)存和流量 此時(shí),我們就可以利用lazy加載技術(shù),當(dāng)界面滑動(dòng)或者滑動(dòng)減速的時(shí)候,都不進(jìn)行圖片加載,只有當(dāng)用戶不再滑動(dòng)并且減速效果停止的時(shí)候,才進(jìn)行加載.
9:正確使用reuseIdentifier來重用Cells
當(dāng)一個(gè)tableView中有多種類型的cell時(shí),需要定義不同的重用標(biāo)識(shí),確保在緩存池正確找到重用的cell.