亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳細整理iOS中UITableView的性能優化

2020-07-26 02:53:08
字體:
來源:轉載
供稿:網友

一、介紹

iOS開發中,UITableView可能是平時我們打交道最多的UI控件之一,其重要性不言而喻。Android也是如此,Android中的ListView和UITableView是相同功能的一個控件,但是iOS的UITableView更為強大一點,原因就不說了,如果你學過Android就知道iOS中的UITableView使用起來是非常簡單的,這也是峰哥喜歡iOS勝過Android的原因之一。今天研究的內容就是UITableView的優化。

開始之前,你能說出幾種UITableView的可優化項?cell復用(Android中經常稱為ListView的重用,其實重用復用都是一個意思,由于峰哥之前做過Android的原因,有時候我經常說“重用”,后面萬一說“重用”大家知道是“復用”的意思就行了)!除了cell重用呢? 

二、UITableView的性能優化

1、cell復用

復用很簡單,這或許是所有iOS開發者最為熟知的一個優化內容,如下代碼:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *Identifier = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; }  return cell;}

但是,這樣重用就完美了嗎?

我們經常在注意cellForRowAtIndexPath:中為每一個cell綁定數據,實際上在調用cellForRowAtIndexPath:的時候cell還沒有被顯示出來,為了提高效率我們應該把數據綁定的操作放在cell顯示出來后再執行,可以在tableView:willDisplayCell:forRowAtIndexPath:(以后簡稱willDisplayCell)方法中綁定數據。

注意willDisplayCell在cell 在tableview展示之前就會調用,此時cell實例已經生成,所以不能更改cell的結構,只能是改動cell上的UI的一些屬性(例如label的內容等)。

2、cell高度的計算

這邊我們分為兩種cell,一種是定高的cell,另外一種是動態高度的cell。

(1)定高的cell,應該采用如下方式:

self.tableView.rowHeight = 88;

這個方法指定了所有cell高度都是88的tableview,rowHeight默認的值是44,所以一個空的TableView會顯示成這個樣子。對于定高cell,直接采用上面方式給定高度,不需要實現tableView:heightForRowAtIndexPath:以節省不必要的計算和開銷。

(2)動態高度的cell

我們需要實現它的代理,來給出高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // return xxx}

這個代理方法實現后,上面的rowHeight的設置將會變成無效。在這個方法中,我們需要提高cell高度的計算效率,來節省時間。

自從iOS8之后有了self-sizing cell的概念,cell可以自己算出高度,使用self-sizing cell需要滿足以下三個條件:

(1)使用Autolayout進行UI布局約束(要求cell.contentView的四條邊都與內部元素有約束關系)。

(2)指定TableView的estimatedRowHeight屬性的默認值。

(3)指定TableView的rowHeight屬性為UITableViewAutomaticDimension。

- (void)viewDidload { self.myTableView.estimatedRowHeight = 44.0; self.myTableView.rowHeight = UITableViewAutomaticDimension;}

除了提高cell高度的計算效率之外,對于已經計算出的高度,我們需要進行緩存,對于已經計算過的高度,沒有必要進行計算第二次。

3、渲染

為了保證TableView的流暢,當快速滑動的時候,cell必須被快速的渲染出來。所以cell渲染的速度必須快。如何提高cell的渲染速度呢?

(1)當有圖像時,預渲染圖像,在bitmap context先將其畫一遍,導出成UIImage對象,然后再繪制到屏幕,這會大大提高渲染速度。具體內容可以自行查找“利用預渲染加速顯示iOS圖像”相關資料。

(2)渲染最好時的操作之一就是混合(blending)了,所以我們不要使用透明背景,將cell的opaque值設為Yes,背景色不要使用clearColor,盡量不要使用陰影漸變等

(3)由于混合操作是使用GPU來執行,我們可以用CPU來渲染,這樣混合操作就不再執行??梢栽赨IView的drawRect方法中自定義繪制。

4、減少視圖的數目

我們在cell上添加系統控件的時候,實際上系統都會調用底層的接口進行繪制,大量添加控件時,會消耗很大的資源并且也會影響渲染的性能。當使用默認的UITableViewCell并且在它的ContentView上面添加控件時會相當消耗性能。所以目前最佳的方法還是繼承UITableViewCell,并重寫drawRect方法。

5、減少多余的繪制操作

在實現drawRect方法的時候,它的參數rect就是我們需要繪制的區域,在rect范圍之外的區域我們不需要進行繪制,否則會消耗相當大的資源。

6、不要給cell動態添加subView

在初始化cell的時候就將所有需要展示的添加完畢,然后根據需要來設置hide屬性顯示和隱藏。

7、異步化UI,不要阻塞主線程

我們時常會看到這樣一個現象,就是加載時整個頁面卡住不動,怎么點都沒用,仿佛死機了一般。原因是主線程被阻塞了。所以對于網路數據的請求或者圖片的加載,我們可以開啟多線程,將耗時操作放到子線程中進行,異步化操作。這個或許每個iOS開發者都知道的知識,不必多講。

8、滑動時按需加載對應的內容

如果目標行與當前行相差超過指定行數,只在目標滾動范圍的前后指定3行加載。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ NSIndexPath *ip = [self indexPathForRowAtPoint:CGPointMake(0, targetContentOffset->y)]; NSIndexPath *cip = [[self indexPathsForVisibleRows] firstObject]; NSInteger skipCount = 8; if (labs(cip.row-ip.row)>skipCount) {  NSArray *temp = [self indexPathsForRowsInRect:CGRectMake(0, targetContentOffset->y, self.width, self.height)];  NSMutableArray *arr = [NSMutableArray arrayWithArray:temp];  if (velocity.y<0) {   NSIndexPath *indexPath = [temp lastObject];   if (indexPath.row+33) {    [arr addObject:[NSIndexPath indexPathForRow:indexPath.row-3 inSection:0]];    [arr addObject:[NSIndexPath indexPathForRow:indexPath.row-2 inSection:0]];    [arr addObject:[NSIndexPath indexPathForRow:indexPath.row-1 inSection:0]];   }  }  [needLoadArr addObjectsFromArray:arr]; }}

記得在tableView:cellForRowAtIndexPath:方法中加入判斷:

if (needLoadArr.count>0&&[needLoadArr indexOfObject:indexPath]==NSNotFound) { [cell clear]; return;}

滑動很快時,只加載目標范圍內的cell,這樣按需加載(配合SDWebImage),極大提高流暢度。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久天堂国产精品女人| 色综合天天综合网国产成人网| 欧美性猛交xxxx乱大交蜜桃| 日韩免费不卡av| 国产日韩综合一区二区性色av| 清纯唯美日韩制服另类| 欧美做受高潮电影o| 国产福利视频一区二区| 51精品在线观看| 日韩国产欧美精品在线| 精品久久香蕉国产线看观看亚洲| 精品亚洲一区二区| 欧美视频专区一二在线观看| 欧美国产日本在线| 日韩在线视频网站| 日韩电影免费在线观看中文字幕| 欧美日韩黄色大片| 亚洲欧美综合图区| 国产日韩欧美日韩大片| 91精品久久久久久综合乱菊| 久久久久久网址| 日韩电影免费观看在线| 成人激情视频网| 亚洲精品白浆高清久久久久久| 性欧美亚洲xxxx乳在线观看| 欧美美女操人视频| 国产小视频91| 欧美伊久线香蕉线新在线| 一区二区三区 在线观看视| 91精品国产91久久久久久吃药| 亚洲综合中文字幕68页| 亚洲黄一区二区| 亚洲娇小xxxx欧美娇小| 久久久久久国产精品美女| 国产精品日韩在线播放| 91久久精品国产91性色| 欧美肥老妇视频| 国产精品视频免费在线| 日本一欧美一欧美一亚洲视频| 色综合男人天堂| 国产精品白嫩初高中害羞小美女| 国产精品18久久久久久麻辣| 亚洲视频777| 欧美日韩国产中文精品字幕自在自线| 亚洲精品成人久久电影| 视频在线观看99| 国产一区二区三区毛片| 韩国19禁主播vip福利视频| 亚洲精品免费av| 亚洲欧美一区二区激情| 亚洲精品久久视频| 国产精品夜间视频香蕉| 精品网站999www| 国产91ⅴ在线精品免费观看| 国产精品久久久久一区二区| 丝袜美腿亚洲一区二区| www.久久久久久.com| 51色欧美片视频在线观看| 97**国产露脸精品国产| 一区二区三区日韩在线| 国产精品99久久99久久久二8| 精品欧美国产一区二区三区| 国产亚洲欧美aaaa| 国产精品∨欧美精品v日韩精品| 亚洲第一福利网| 欧美精品第一页在线播放| 亚洲精品免费在线视频| 欧美孕妇性xx| 中文字幕欧美国内| 日韩精品久久久久久久玫瑰园| 国产精品一区二区久久精品| 亚洲人成啪啪网站| 精品女厕一区二区三区| 日本中文字幕成人| 亚洲人成在线免费观看| 国内精品久久久久久| 国产欧美精品一区二区三区介绍| 亚洲情综合五月天| 亚洲电影免费观看| www.欧美视频| 欧美激情伊人电影| 日韩男女性生活视频| 九色精品美女在线| 亚洲性69xxxbbb| 久久久久久伊人| 国产欧美一区二区三区四区| 亚洲第一区第一页| 日本久久久久久久久| 97国产成人精品视频| 国产日韩欧美夫妻视频在线观看| 欧美性猛交xxxx偷拍洗澡| 91大神福利视频在线| 亚洲一区二区三区毛片| 亚洲精品日韩激情在线电影| 亚洲高清免费观看高清完整版| 琪琪亚洲精品午夜在线| 欧美午夜美女看片| 亚洲日本欧美日韩高观看| 久久九九亚洲综合| xvideos亚洲人网站| 国产极品精品在线观看| 国产美女久久久| 最近更新的2019中文字幕| 久久久精品网站| 庆余年2免费日韩剧观看大牛| 欧美黄网免费在线观看| 91av网站在线播放| 亚洲美女av电影| 亚洲成人xxx| 亚洲丝袜av一区| 欧美日韩激情网| 91亚洲精品一区二区| 国产精品久久久久久亚洲影视| 日韩电影中文字幕在线| 国产精品影片在线观看| 欧美视频专区一二在线观看| 色777狠狠综合秋免鲁丝| 亚洲男人天堂古典| 日韩有码在线电影| 精品中文字幕在线2019| 91精品美女在线| 欧美精品在线极品| 国产精品xxxxx| 中文字幕亚洲欧美日韩高清| 伦伦影院午夜日韩欧美限制| 精品国内产的精品视频在线观看| 国产视频精品xxxx| 国产成人精品优优av| 九九热这里只有在线精品视| 欧美激情手机在线视频| 伊人久久大香线蕉av一区二区| 亚洲自拍偷拍在线| 国产精品美女在线观看| 亚洲一区二区黄| 久久免费精品视频| 亚洲国产精品网站| 另类色图亚洲色图| 欧美精品一区在线播放| 成人444kkkk在线观看| 久久久最新网址| 在线日韩av观看| 成人黄色免费片| 欧美成人免费小视频| 国产福利成人在线| 国产精品美女免费视频| 亚洲欧美国产视频| 日韩福利在线播放| 亚洲在线第一页| 亚洲激情国产精品| 亚洲va电影大全| 国产精品v日韩精品| 欧美高跟鞋交xxxxhd| 国产自摸综合网| 亚洲欧美综合精品久久成人| 国产成人精彩在线视频九色| 欧美精品福利在线| 97精品一区二区视频在线观看| 亚洲成人三级在线| 精品视频在线导航| 亚洲最大中文字幕| 2021久久精品国产99国产精品| 国产精品普通话| 91超碰中文字幕久久精品| 欧美猛交免费看|