博客> iOS 本地图片做圆角的高性能处理
iOS 本地图片做圆角的高性能处理
2017-11-21 12:33 评论:0 阅读:110 lvhahaha
iOS打圆角高性能

一般我们在iOS开发的过程中设置圆角都是如下这样设置的。

avatarImageView.clipsToBounds = YES; [avatarImageView.layer setCornerRadius:50];

这样设置会触发离屏渲染,比较消耗性能。比如当一个页面上有十几头像这样设置了圆角 会明显感觉到卡顿。

设置圆角的方法

直接使用setCornerRadius

这种就是最常用的,也是最耗性能的。 setCornerRadius设置圆角之后,shouldRasterize=YES光栅化

avatarImageView.clipsToBounds = YES; [avatarImageView.layer setCornerRadius:50]; avatarImageView.layer.shouldRasterize = YES; avatarImageViewUrl.layer.rasterizationScale=[UIScreen mainScreen].scale; //UIImageView不加这句会产生一点模糊

shouldRasterize=YES设置光栅化,可以使离屏渲染的结果缓存到内存中存为位图, 使用的时候直接使用缓存,节省了一直离屏渲染损耗的性能。

但是如果layer及sublayers常常改变的话,它就会一直不停的渲染及删除缓存重新 创建缓存,所以这种情况下建议不要使用光栅化,这样也是比较损耗性能的。 直接覆盖一张中间为圆形透明的图片(推荐使用)

这种方法就是多加了一张透明的图片,GPU计算多层的混合渲染blending也是会消耗 一点性能的,但比第一种方法还是好上很多的。 UIImage drawInRect绘制圆角

这种方式GPU损耗低内存占用大,而且UIButton上不知道怎么绘制,可以用 UIimageView添加个点击手势当做UIButton使用。

UIGraphicsBeginImageContextWithOptions(avatarImageView.bounds.size, NO, [UIScreen mainScreen].scale); [[UIBezierPath bezierPathWithRoundedRect:avatarImageView.bounds cornerRadius:50] addClip]; [image drawInRect:avatarImageView.bounds]; avatarImageView.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();

这段方法可以写在SDWebImage的completed回调里,在主线程异步绘制。 也可以封装到UIImageView里,写了个DSRoundImageView。后台线程异步绘制,不会阻塞主线程。

那么现在使用最高性能的圆角处理 代码

//

@implementation UIImage (CircleImage)

  • (UIImage *)drawCircleImage {

    CGRect rect = (CGRect){0,0,self.size,}; UIGraphicsBeginImageContextWithOptions(self.size, NO, [UIScreen mainScreen].scale); [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:10] addClip]; [self drawInRect:rect];

    UIImage *output = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return output; } @end

使用: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ UIImage *img = [[UIImage imageNamed:@"room_head_lock"] drawCircleImage]; dispatch_async(dispatch_get_main_queue(), ^{ _lockImage.image = img; }); });

性能提高很多

收藏
0
sina weixin mail 回到顶部