小点
圆角优化的几种方式
第一种:设置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以上由于没有了离屏渲染更是首选。
方法三由于需要大量计算和增加部分内存,需要实际情况各自取舍。