UIImageView的性能优化

UIImageView是我们经常使用的UI控件,平时感觉不到有什么好优化的,其实不然。
最近研究这个控件,其实可以从以下三个方面对其进行性能优化:

1、圆角

常规写法:

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

上面的方式会强制Core Animation提前渲染屏幕的离屏绘制,而离
屏绘制就会给性能带来负面影响,会有卡顿的现象出现。

优化方案:

1、使用绘图技术

- (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();
    //关闭上下文UIGraphicsEndImageContext();
    returnimage;
}

2、使用了贝塞尔曲线"切割"个这个图片,给UIImageView添加了的圆角,其实也是通过绘图技术来实现的

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];

其实这个优化不仅对于UIImageView,对所有UIView控件都是一致的。

2、UIImage加载图片

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

imageNamed默认加载图片成功后会内存中缓存图片,这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象.如果缓存中没有找到相应的图片对象,则从指定地方加载图片然后缓存对象,并返回这个图片对象.

imageWithContentsOfFile则仅只加载图片,不缓存.

大量使用imageNamed方式会在不需要缓存的地方额外增加开销CPU的时间来做这件事.当应用程序需要加载一张比较大的图片并且使用一次性,那么其实是没有必要去缓存这个图片的,用imageWithContentsOfFile是最为经济的方式,这样不会因为UIImage元素较多情况下,CPU会被逐个分散在不必要缓存上浪费过多时间。

使用场景需要编程时,应该根据实际应用场景加以区分,UIimage虽小,但使用元素较多问题会有所凸显。

3、图片压缩

如果要在UIImageView中显示一个来自bundle的图片,你应保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的。

当然还有其他一些方法来优化UIImageView,比如opaque属性设置为YES、避免过于庞大的XIB、避免阻塞主线程等。

如果还有其他方法,欢迎补充。

你可能感兴趣的:(UIImageView的性能优化)