盒子
盒子
文章目录
  1. 小点
    1. 圆角优化的几种方式

小Case

小点

圆角优化的几种方式

第一种:设置CALayer的cornerRadius

imageView.image = [UIImage imageNamed:@”img”];
imageView.image.layer.cornerRadius = 5;
imageView.image.layer.masksToBounds = YES;
这样设置会触发离屏渲染,比较消耗性能。比如当一个页面上有十几头像这样设置了圆角

会明显感觉到卡顿。
这种就是最常用的,也是最耗性能的。

注意:ios9.0之后对UIImageView的圆角设置做了优化,UIImageView这样设置圆角
不会触发离屏渲染,ios9.0之前还是会触发离屏渲染。而UIButton还是都会触发离屏渲染。

第二种
imageView.clipsToBounds = YES;
imageView.layer setCornerRadius:50];
imageView.layer.shouldRasterize = YES;
shouldRasterize=YES设置光栅化,可以使离屏渲染的结果缓存到内存中存为位图, 使用的时候直接使用缓存,节省了一直离屏渲染损耗的性能。

但是如果layer及sublayers常常改变的话,它就会一直不停的渲染及删除缓存重新 创建缓存,所以这种情况下建议不要使用光栅化,这样也是比较损耗性能的。

第三种 :通过Core Graphics重新绘制带圆角的视图
这种方式性能最好,但是UIButton上不知道怎么绘制,可以用UIimageView添加个 点击手势当做UIButton使用

@implementation UIImage (CircleImage)

  • (UIImage *)drawCircleImage {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);
    [[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:50] addClip];
    [self drawInRect:self.bounds];

UIImage output = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return output;
}
@end
//在需要圆角时调用如下
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage
img = [[UIImage imageNamed:@”image.png”] drawCircleImage];
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = img;
});
});

四、通过混合图层
此方法就是在要添加圆角的视图上再叠加一个部分透明的视图,只对圆角部分进行遮挡。图层混合的透明度处理方式与mask正好相反。此方法虽然是最优解,没有离屏渲染,没有额外的CPU计算,但是应用范围有限。

总结
在可以使用混合图层遮挡的场景下,优先使用第四种方法。
即使是非iOS9以上系统,第一种方法在综合性能上依然强于后两者,iOS9以上由于没有了离屏渲染更是首选。
方法三由于需要大量计算和增加部分内存,需要实际情况各自取舍。

支持一下
扫一扫,支持ddSoul