UIImageView的性能優(yōu)化

UIImageView是我們經(jīng)常使用的UI控件,平時感覺不到有什么好優(yōu)化的,其實(shí)不然。
最近研究這個控件,其實(shí)可以從以下三個方面對其進(jìn)行性能優(yōu)化:

1、圓角

常規(guī)寫法:

self.view.layer.cornerRadius=5;
self.view.layer.masksToBounds=YES;

上面的方式會強(qiáng)制Core Animation提前渲染屏幕的離屏繪制,而離
屏繪制就會給性能帶來負(fù)面影響,會有卡頓的現(xiàn)象出現(xiàn)。

優(yōu)化方案:

1、使用繪圖技術(shù)

- (UIImage*)circleImage
{
    //NO代表透明
    UIGraphicsBeginImageContextWithOptions(self.size,NO,0.0);
    //獲得上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //添加一個圓
    CGRectrect = CGRectMake(0,0,self.size.width,self.size.height);
    CGContextAddEllipseInRect(ctx, rect);
    //裁剪CGContextClip(ctx);
    //將圖片畫上去
    [selfdrawInRect:rect];
    UIImage  *image = UIGraphicsGetImageFromCurrentImageContext();
    //關(guān)閉上下文UIGraphicsEndImageContext();
    returnimage;
}

2、使用了貝塞爾曲線"切割"個這個圖片,給UIImageView添加了的圓角,其實(shí)也是通過繪圖技術(shù)來實(shí)現(xiàn)的

UIImageView*imageView = [[UIImageViewalloc]
initWithFrame:CGRectMake(0,0,100,100)];
imageView.center= CGPointMake(200,300);

UIImage*anotherImage = [UIImageimageNamed:@"image"];
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,NO,1.0);
[[UIBezierPathbezierPathWithRoundedRect:imageView.bounds cornerRadius:50] addClip];
[anotherImage drawInRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self.viewaddSubview:imageView];

其實(shí)這個優(yōu)化不僅對于UIImageView,對所有UIView控件都是一致的。

2、UIImage加載圖片

A:imagedNamed初始化
B:imageWithContentsOfFile初始化

imageNamed默認(rèn)加載圖片成功后會內(nèi)存中緩存圖片,這個方法用一個指定的名字在系統(tǒng)緩存中查找并返回一個圖片對象.如果緩存中沒有找到相應(yīng)的圖片對象,則從指定地方加載圖片然后緩存對象,并返回這個圖片對象.

imageWithContentsOfFile則僅只加載圖片,不緩存.

大量使用imageNamed方式會在不需要緩存的地方額外增加開銷CPU的時間來做這件事.當(dāng)應(yīng)用程序需要加載一張比較大的圖片并且使用一次性,那么其實(shí)是沒有必要去緩存這個圖片的,用imageWithContentsOfFile是最為經(jīng)濟(jì)的方式,這樣不會因?yàn)閁IImage元素較多情況下,CPU會被逐個分散在不必要緩存上浪費(fèi)過多時間。

使用場景需要編程時,應(yīng)該根據(jù)實(shí)際應(yīng)用場景加以區(qū)分,UIimage雖小,但使用元素較多問題會有所凸顯。

3、圖片壓縮

如果要在UIImageView中顯示一個來自bundle的圖片,你應(yīng)保證圖片的大小和UIImageView的大小相同。在運(yùn)行中縮放圖片是很耗費(fèi)資源的。

當(dāng)然還有其他一些方法來優(yōu)化UIImageView,比如opaque屬性設(shè)置為YES、避免過于龐大的XIB、避免阻塞主線程等。

如果還有其他方法,歡迎補(bǔ)充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文轉(zhuǎn)載自:http://www.cocoachina.com/ios/20150106/10840.html 為...
    idiot_lin閱讀 796評論 0 1
  • 在第13章“高效繪圖”中,我們研究了和Core Graphics繪圖相關(guān)的性能問題,以及如何修復(fù)。和繪圖性能相關(guān)緊...
    雪_晟閱讀 720評論 0 0
  • 性能優(yōu)化 1.如何讓你的應(yīng)用程序更加省電? 答:(1)如果程序用到定位,需要在定位完畢之后關(guān)閉定位,或者降低定位的...
    丶逐漸閱讀 1,029評論 0 6
  • 一、如何提高一個應(yīng)用程序的性能?1、使用ARC減少內(nèi)存失誤,dealloc需要重寫并對屬性置nil。2、重用。3、...
    金歌漫舞閱讀 1,068評論 2 6
  • 一個由笑引發(fā)的夢。一場由夢引發(fā)的思考。昨日夜里,清晰一夢,讓我感慨萬千,誰知醒來竟清晰記得細(xì)節(jié)。 ...
    涇河川里的娃閱讀 384評論 0 0

友情鏈接更多精彩內(nèi)容