一直覺得簡書是個充滿文學氛圍濃厚的平臺叶雹,后來一些同事和圈友經(jīng)常問一些技術(shù)方面的問題濒翻,說我要是把我那本經(jīng)常用來記錄開發(fā)中遇到問題的解決問題的隨機本給分享到簡書上不撑,我們就不用經(jīng)常麻煩你了圈匆,也可以幫到很多iOS初學者快毛,想想有道理格嗅,后來又因為時間和文筆匱乏的關(guān)系,一直沒有著手這個事唠帝,種種原因下了個決定屯掖,以后每個禮拜會抽出部分時間,把一些開發(fā)中遇到解決了的問題襟衰,在這里分享一下贴铜。
下面是最近親測的一個關(guān)于cell中經(jīng)常要裁剪用戶頭像為圓形頭像的一些方法,之前包括查網(wǎng)上資料瀑晒,一直說用貝塞爾路徑畫出來的圓形圖片比 直接設(shè)置圓角半徑性能更高绍坝,但是親測發(fā)現(xiàn),從iOS9后苔悦,蘋果對圓角半徑這個做了性能優(yōu)化轩褐,用它完全不會影響你的幀數(shù),甚至性能比畫的更好玖详,廢話不多說直接上代碼:
裁剪圓形圖片的方法:
①畫圖把介,開啟上下文,獲得新的圓形圖片
兩種上下文: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 * 邊框?qū)挾?
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.設(shè)置裁剪區(qū)域
UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(borderW, borderW, image.size.width, image.size.height)];
//3.1 把路徑設(shè)置為裁剪區(qū)域
[clipPath addClip];
//4 把圖片繪制到上下文
[image drawAtPoint:CGPointMake(borderW, borderW)];
//5.從上下文當中獲取圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//6.關(guān)閉上下文
UIGraphicsEndImageContext();
return newImage;
}
②設(shè)置圓角半徑
-(void)layoutSubviews{
[super layoutSubviews] ;
_iconImageView.layer.cornerRadius = _iconImageView.JG_width * 0.5 ;
//超出主層就會剪切掉
_iconImageView.layer.masksToBounds = YES ;
}
注:這個要在layoutSubviews里面用,才能設(shè)置寬度砂缩;
之前設(shè)置圓角是會降低幀數(shù)作谚,但是親測 iOS9開始cornerRadius不會對幀數(shù)有影響,
③runtime直接在xib中添加屬性庵芭,不是很推薦使用(因為不在代碼中顯示妹懒,不直觀,不利于程序員之間交流)
注:幾個項目中親測發(fā)現(xiàn)双吆,用runtime或layer層剪切圓形圖片內(nèi)存占用小眨唬,位圖上下文占用最大