tableView優(yōu)化:
1.cell的重用
2.dequeueReusableCellWithIdentifier:forIndexPath:(會調(diào)用heightForRowAtIndexPath)和dequeueReusableCellWithIdentifier (后面這個不會再次調(diào)用heightForRowAtIndexPath)
2.1 tableView在cell顯示之前會調(diào)用heightForRowAtIndexPath,有多少個cell就會調(diào)用多少次,算contentSize
2.2使用了預(yù)估行高,并不會在顯示之前去計(jì)算獲取所有的行高(預(yù)估行高,等cell要顯示的時候才回去計(jì)算真實(shí)的高度),根據(jù)預(yù)估行高和實(shí)際行高來獲取cell的行高,先根據(jù)預(yù)估行高計(jì)算好要先獲取幾個cell,如果計(jì)算的這幾個cell高度確實(shí)夠(高度能超出屏幕的高度就不計(jì)算了.如果不夠還會計(jì)算),目的也是讓contentSize大于屏幕,就能滾動,后面要顯示,才來計(jì)算行高,所以會發(fā)現(xiàn)滾動條會跳
3.cell的高度是根據(jù)內(nèi)容變化的時候,只計(jì)算一次,將高度緩存起來
overridefunctableView(tableView:UITableView, heightForRowAtIndexPath indexPath:NSIndexPath) ->CGFloat{
//獲取模型
letstatus =self.statuses![indexPath.row]
//判斷模型里面之前有沒有緩存過行高
ifstatus.rowHeight!=nil
{
//之前保存過行高,直接返回行高
returnstatus.rowHeight!
}
//自己計(jì)算行高:AutoLayout自動約束
//讓cell設(shè)置對應(yīng)內(nèi)容,可以直接直接獲取,這個cell不參與顯示
letcell = tableView.dequeueReusableCellWithIdentifier(ReuseIndentifier)as!HMStatusCell
cell.status= status
letheight = cell.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
status.rowHeight= height
returnheight
}
4.下載圖片使用SDWebImage(異步操作)
5.cellForRowAtIndexPath不要做耗時操作
1.讀取文件,寫入文件,最好是放到子線程,或先讀取好,在讓tableView去顯示
2.盡量不要再這個方法里解壓資源
3.盡量少得計(jì)算計(jì)算,最好是先計(jì)算好,cellForRowAtIndexPath只做顯示
4.盡量不要去添加和移除view,現(xiàn)將會用到的控件懶加載,要就顯示,不要就隱藏
6.tableView滾動的時候,不要去做動畫(微信的聊天界面做的就很好,在滾動的時候,動態(tài)圖就不讓他動,滾動停止的時候才動,不然可能會有點(diǎn)影響流暢度)
7.cell里面的控件,約束最好不要使用remake,動態(tài)添加約束是比較耗性能的
8.cell里面的控件,背景最好是不透明的(圖層混合靠GPU去渲染,會影響性能,綠色的好,紅色的性能差), view的背景顏色clearColor盡量少
9.圖片圓角不要使用layer.cornerRadius,因?yàn)橥ㄟ^圖層去渲染的話都會影響性能
10.圖層最好不要使用陰影,陰影會導(dǎo)致離屏渲染(在進(jìn)入屏幕渲染之前,還看不到的時候會再渲染一次,盡量不要產(chǎn)生離屏渲染)
11.異步繪制
12.柵格化
13.借助工具來測試性能
14.AsyncDisplayKit ->不使用UIKit (UIView) ->? (Node)