UITableView的性能優(yōu)化

一款優(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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诺苹,一起剝皮案震驚了整個(gè)濱河市咕晋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌收奔,老刑警劉巖掌呜,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坪哄,居然都是意外死亡质蕉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門损姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饰剥,“玉大人,你說我怎么就攤上這事摧阅√兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵棒卷,是天一觀的道長(zhǎng)顾孽。 經(jīng)常有香客問我,道長(zhǎng)比规,這世上最難降的妖魔是什么若厚? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮蜒什,結(jié)果婚禮上测秸,老公的妹妹穿的比我還像新娘。我一直安慰自己灾常,他們只是感情好霎冯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钞瀑,像睡著了一般沈撞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雕什,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天缠俺,我揣著相機(jī)與錄音显晶,去河邊找鬼。 笑死壹士,一個(gè)胖子當(dāng)著我的面吹牛磷雇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墓卦,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼倦春,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了落剪?” 一聲冷哼從身側(cè)響起睁本,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忠怖,沒想到半個(gè)月后呢堰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡泣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年枉疼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞋拟。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骂维,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贺纲,到底是詐尸還是另有隱情航闺,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布猴誊,位于F島的核電站潦刃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懈叹。R本人自食惡果不足惜乖杠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澄成。 院中可真熱鬧胧洒,春花似錦、人聲如沸墨状。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)歉胶。三九已至汛兜,卻和暖如春巴粪,著一層夾襖步出監(jiān)牢的瞬間通今,已是汗流浹背粥谬。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辫塌,地道東北人漏策。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像臼氨,于是被迫代替她去往敵國(guó)和親掺喻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容