一直觉得简书是个充满文学氛围浓厚的平台,后来一些同事和圈友经常问一些技术方面的问题,说我要是把我那本经常用来记录开发中遇到问题的解决问题的随机本给分享到简书上,我们就不用经常麻烦你了,也可以帮到很多iOS初学者,想想有道理,后来又因为时间和文笔匮乏的关系,一直没有着手这个事,种种原因下了个决定,以后每个礼拜会抽出部分时间,把一些开发中遇到解决了的问题,在这里分享一下。
下面是最近亲测的一个关于cell中经常要裁剪用户头像为圆形头像的一些方法,之前包括查网上资料,一直说用贝塞尔路径画出来的圆形图片比 直接设置圆角半径性能更高,但是亲测发现,从iOS9后,苹果对圆角半径这个做了性能优化,用它完全不会影响你的帧数,甚至性能比画的更好,废话不多说直接上代码:
裁剪圆形图片的方法:
①画图,开启上下文,获得新的圆形图片
两种上下文:layer只能在view上面和图形上下文
opaque:不透明度 YES:会让裁剪掉的部分为黑色; No:让裁剪掉的部分为透明,
scale:比例因子,为2则✖️2倍,像素与点比例 为0: 自动识别 [UIScreen mainScreen].scale
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0) ;
将裁剪圆形图片给UIImage封装一个分类:
// borderW是圆形图片边框的宽度,borderColor是边框颜色,image需要裁剪为圆形的图片
+ (UIImage *)imageWithBorderW:(CGFloat)borderW borderColor:(UIColor *)color image:(UIImage *)image{
if (!image) return nil;
//1.生成一张图片,开启一个位图上下文(大小,图片的宽高 + 2 * 边框宽度)
CGSize size = CGSizeMake(image.size.width + 2 *borderW, image.size.height + 2 *borderW);
UIGraphicsBeginImageContext(size);
//2.绘制一个大圆
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, size.width, size.height)];
[color set];
[path fill];
//3.设置裁剪区域
UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(borderW, borderW, image.size.width, image.size.height)];
//3.1 把路径设置为裁剪区域
[clipPath addClip];
//4 把图片绘制到上下文
[image drawAtPoint:CGPointMake(borderW, borderW)];
//5.从上下文当中获取图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//6.关闭上下文
UIGraphicsEndImageContext();
return newImage;
}
②设置圆角半径
-(void)layoutSubviews{
[super layoutSubviews] ;
_iconImageView.layer.cornerRadius = _iconImageView.JG_width * 0.5 ;
//超出主层就会剪切掉
_iconImageView.layer.masksToBounds = YES ;
}
注:这个要在layoutSubviews里面用,才能设置宽度;
之前设置圆角是会降低帧数,但是亲测 iOS9开始cornerRadius不会对帧数有影响,
③runtime直接在xib中添加属性,不是很推荐使用(因为不在代码中显示,不直观,不利于程序员之间交流)
注:几个项目中亲测发现,用runtime或layer层剪切圆形图片内存占用小,位图上下文占用最大