資源描述:
《優(yōu)化uitableview性能》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、在iOS應(yīng)用中,UITableView應(yīng)該是使用率最高的視圖之一了。iPod、時(shí)鐘、日歷、備忘錄、Mail、天氣、照片、電話(huà)、短信、Safari、AppStore、iTunes、GameCenter?幾乎所有自帶的應(yīng)用中都能看到它的身影,可見(jiàn)它的重要性。然而在使用第三方應(yīng)用時(shí),卻經(jīng)常遇到性能上的問(wèn)題,普遍表現(xiàn)在滾動(dòng)時(shí)比較卡,特別是tablecell中包含圖片的情況時(shí)。實(shí)際上只要針對(duì)性地優(yōu)化一下,這種問(wèn)題就不會(huì)有了。有興趣的可以看看LazyTableImages這個(gè)官方的例子程序,雖然也要從網(wǎng)上下
2、載圖片并顯示,但滾動(dòng)時(shí)絲毫不卡。下面就說(shuō)說(shuō)我對(duì)UITableView的了解。不過(guò)由于我也是初學(xué)者,或許會(huì)說(shuō)錯(cuò)或遺漏一些,因此僅供參考。首先說(shuō)下UITableView的原理。有興趣的可以看看《AboutTableViewsiniOS-BasedApplications》。UITableView是UIScrollView的子類(lèi),因此它可以自動(dòng)響應(yīng)滾動(dòng)事件(一般為上下滾動(dòng))。它內(nèi)部包含0到多個(gè)UITableViewCell對(duì)象,每個(gè)tablecell展示各自的內(nèi)容。當(dāng)新cell需要被顯示時(shí),就會(huì)調(diào)用t
3、ableView:cellForRowAtIndexPath:方法來(lái)獲取或創(chuàng)建一個(gè)cell;而不可視時(shí),它又會(huì)被釋放。由此可見(jiàn),同一時(shí)間其實(shí)只需要存在一屏幕的cell對(duì)象即可,不需要為每一行創(chuàng)建一個(gè)cell。此外,UITableView還可以分為多個(gè)sections,每個(gè)區(qū)段都可以有自己的head、foot和cells。而在定位一個(gè)cell時(shí),就需要2個(gè)字段了:在哪個(gè)section,以及在這個(gè)section的第幾行。這在iOSSDK中是用NSIndexPath來(lái)表述的,UIKit為其添加了ind
4、exPathForRow:inSection:這個(gè)創(chuàng)建方法。其他諸如編輯之類(lèi)的就不提了,因?yàn)楹捅疚臒o(wú)關(guān)。介紹完原理,接下來(lái)就開(kāi)始優(yōu)化吧。1.使用不透明視圖。不透明的視圖可以極大地提高渲染的速度。因此如非必要,可以將tablecell及其子視圖的opaque屬性設(shè)為YES(默認(rèn)值)。其中的特例包括背景色,它的alpha值應(yīng)該為1(例如不要使用clearColor);圖像的alpha值也應(yīng)該為1,或者在畫(huà)圖時(shí)設(shè)為不透明。2.不要重復(fù)創(chuàng)建不必要的tablecell。前面說(shuō)了,UITableView只需
5、要一屏幕的UITableViewCell對(duì)象即可。因此在cell不可見(jiàn)時(shí),可以將其緩存起來(lái),而在需要時(shí)繼續(xù)使用它即可。而UITableView也提供了這種機(jī)制,只需要簡(jiǎn)單地設(shè)置一個(gè)identifier即可:3.staticNSString*CellIdentifier=@"xxx";4.UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];5.if(cell==nil){6.cell=[[
6、[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]autorelease];}值得一提的是,cell被重用時(shí),它內(nèi)部繪制的內(nèi)容并不會(huì)被自動(dòng)清除,因此你可能需要調(diào)用setNeedsDisplayInRect:或setNeedsDisplay方法??闭`:只是在模擬器上測(cè)試如此,真機(jī)調(diào)試時(shí)沒(méi)有這種bug。1.減少視圖的數(shù)目。UITableViewCell包含了tex
7、tLabel、detailTextLabel和imageView等view,而你還可以自定義一些視圖放在它的contentView里。然而view是很大的對(duì)象,創(chuàng)建它會(huì)消耗較多資源,并且也影響渲染的性能。如果你的tablecell包含圖片,且數(shù)目較多,使用默認(rèn)的UITableViewCell會(huì)非常影響性能。奇怪的是,使用自定義的view,而非預(yù)定義的view,明顯會(huì)快些。當(dāng)然,最佳的解決辦法還是繼承UITableViewCell,并在其drawRect:中自行繪制:2.-(void)drawRe
8、ct:(CGRect)rect{3.if(image){4.[imagedrawAtPoint:imagePoint];5.self.image=nil;6.}else{7.[placeHolderdrawAtPoint:imagePoint];8.}9.10.[textdrawInRect:textRectwithFont:fontlineBreakMode:UILineBreakModeTailTruncation];}不過(guò)這樣一來(lái),你會(huì)發(fā)現(xiàn)選中一行后,這個(gè)cell就變藍(lán)了,其中的內(nèi)容就被擋