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ǔ)充。