TableView為什么會卡溉躲?
主要由以下原因:
cellForRowAtIndexPath:方法中處理了過多業(yè)務(wù)
tablev
iewCell的subview層級太復(fù)雜胚宦,做了大量透明處理
cell的height動態(tài)變化時計算方式不對
優(yōu)化核心思想:UITableViewCell重用機(jī)制
簡單的理解就是:UITableView只會創(chuàng)建一屏幕(或一屏幕多一點(diǎn))的UITableViewCell,其他都是從中取出來重用的戒洼。每當(dāng)Cell滑出屏幕時俏橘,就會放入到一個集合(或數(shù)組)中(這里就相當(dāng)于一個重用池),當(dāng)要顯示某一位置的Cell時圈浇,會先去集合(或數(shù)組)中取寥掐,如果有,就直接拿來顯示磷蜀;如果沒有召耘,才會創(chuàng)建。這樣做的好處可想而知褐隆,極大的減少了內(nèi)存的開銷污它。
Tips:
提前計算并緩存好高度(布局),因為heightForRowAtIndexPath:是調(diào)用最頻繁的方法庶弃;
異步繪制,遇到復(fù)雜界面,參考Facebook的AsyncDisplayKit和YYAsyncLayer異步繪制框架衫贬;
緩存圖片(SDWebImage),提前處理好UIImageView圖片的尺寸按需加載而不是加載原圖歇攻;
計算等耗時操作異步處理固惯,處理完再回主線程更新UI;
圖文混排不定高度采用CoreText排版缴守,緩存Cell高度參考YYKit缝呕;
實現(xiàn)Cell的drawRect:方法直接繪制,減少UIView斧散,UIImageView,UILabel等容器的使用摊聋。
Bonus:
正確使用reuseIdentifier來重用Cell鸡捐;
盡量少用或不用透明圖層或View;
如果Cell內(nèi)現(xiàn)實的內(nèi)容來自web麻裁,使用異步加載箍镜,緩存請求結(jié)果;
減少subviews的數(shù)量在heightForRowAtIndexPath:中盡量不使用cellForRowAtIndexPath:煎源,如果你需要用到它色迂,只用一次然后緩存結(jié)果;
盡量少用addView給Cell動態(tài)添加View手销,可以初始化時就添加歇僧,然后通過hide來控制是否顯示;
固定高度不要實現(xiàn)heightForRowAtIndexPath:方法。
1.UITableViewCell里不要添加太多subview诈悍,最好只添加一個cellview祸轮。
2.UITableViewCell 上的子View的opaque屬性設(shè)為YES。其實默認(rèn)也是不透明侥钳。UITableViewCell盡量不要包含透明的子View适袜。
3.在cellview里,重寫drawRect函數(shù)繪制UITableViewCell的內(nèi)容舷夺。
4.在繪制字符串時苦酱,盡可能使用drawAtPoint: withFont:,而不要使用更復(fù)雜的drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode; 如果要繪制過長的字符串给猾,建議自己先截斷疫萤,然后使用drawAtPoint: withFont:方法繪制。
5.在繪制圖片時耙册,盡量使用drawAtPoint给僵,而不要使用drawInRect。drawInRect如果在繪制過程中對圖片進(jìn)行放縮详拙,會特別消耗CPU帝际。
6.如果繪制cell過程中,需要下載cell中的圖片饶辙,建議在繪制cell一段時間后再開啟圖片下載任務(wù)蹲诀。譬如先畫一個默認(rèn)圖片,然后在0.5S后開始下載本cell的圖片弃揽。
7.即使下載cell 圖片是在子線程中進(jìn)行脯爪,在繪制cell過程中,也不能開啟過多的子線程矿微。最好只有一個下載圖片的子線程在活動痕慢。否則也會影響UITableViewCell的繪制,因而影響了UITableViewCell的滑動速度涌矢。(建議結(jié)合使用NSOpeartion和NSOperationQueue來下載圖片掖举,如果想盡可能找的下載圖片,可以把[self.queuesetMaxConcurrentOperationCount:4];)
8.最好自己寫一個cache娜庇,用來緩存UITableView中的UITableViewCell塔次,這樣在整個UITableView的生命周期里,一個cell只需繪制一次名秀,并且如果發(fā)生內(nèi)存不足励负,也可以有效的釋放掉緩存的cell。
9.不要將tableview的背景顏色設(shè)置成一個圖片匕得。這回嚴(yán)重影響UITableView的滑動速度继榆。在限時免費(fèi)搜索里,我曾經(jīng)翻過一個錯誤:self.tableView_.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"background.png"]]; 通過這種方式設(shè)置UITableView的背景顏色會嚴(yán)重影響UTIableView的滑動流暢性。修改成`self.tableView_.backgroundColor` = [UIColor clearColor];之后裕照,fps從43上升到60左右攒发。滑動比較流暢晋南。
10.cell的行高不是固定值惠猿,需要計算,則要盡可能緩存行高值负间,避免重復(fù)計算行高偶妖。這里指的是UITableViewDelegate里的行高函數(shù)。
如果做到以上10點(diǎn)政溃,則UITableView 滑動的fps可以達(dá)到60 fps趾访。滑動非常順暢