一直覺得簡(jiǎn)書是個(gè)充滿文學(xué)氛圍濃厚的平臺(tái),后來(lái)一些同事和圈友經(jīng)常問(wèn)一些技術(shù)方面的問(wèn)題,說(shuō)我要是把我那本經(jīng)常用來(lái)記錄開發(fā)中遇到問(wèn)題的解決問(wèn)題的隨機(jī)本給分享到簡(jiǎn)書上,我們就不用經(jīng)常麻煩你了,也可以幫到很多iOS初學(xué)者,想想有道理,后來(lái)又因?yàn)闀r(shí)間和文筆匱乏的關(guān)系,一直沒有著手這個(gè)事,種種原因下了個(gè)決定,以后每個(gè)禮拜會(huì)抽出部分時(shí)間,把一些開發(fā)中遇到解決了的問(wèn)題,在這里分享一下。
下面是最近親測(cè)的一個(gè)關(guān)于cell中經(jīng)常要裁剪用戶頭像為圓形頭像的一些方法,之前包括查網(wǎng)上資料,一直說(shuō)用貝塞爾路徑畫出來(lái)的圓形圖片比 直接設(shè)置圓角半徑性能更高,但是親測(cè)發(fā)現(xiàn),從iOS9后,蘋果對(duì)圓角半徑這個(gè)做了性能優(yōu)化,用它完全不會(huì)影響你的幀數(shù),甚至性能比畫的更好,廢話不多說(shuō)直接上代碼:
裁剪圓形圖片的方法:
①畫圖,開啟上下文,獲得新的圓形圖片
兩種上下文:layer只能在view上面和圖形上下文
opaque:不透明度 YES:會(huì)讓裁剪掉的部分為黑色; No:讓裁剪掉的部分為透明,
scale:比例因子,為2則??2倍,像素與點(diǎn)比例 為0: 自動(dòng)識(shí)別 [UIScreen mainScreen].scale
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0) ;
將裁剪圓形圖片給UIImage封裝一個(gè)分類:
// borderW是圓形圖片邊框的寬度,borderColor是邊框顏色,image需要裁剪為圓形的圖片
+ (UIImage *)imageWithBorderW:(CGFloat)borderW borderColor:(UIColor *)color image:(UIImage *)image{
if (!image) return nil;
//1.生成一張圖片,開啟一個(gè)位圖上下文(大小,圖片的寬高 + 2 * 邊框?qū)挾?
CGSize size = CGSizeMake(image.size.width + 2 *borderW, image.size.height + 2 *borderW);
UIGraphicsBeginImageContext(size);
//2.繪制一個(gè)大圓
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.從上下文當(dāng)中獲取圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//6.關(guān)閉上下文
UIGraphicsEndImageContext();
return newImage;
}
②設(shè)置圓角半徑
-(void)layoutSubviews{
[super layoutSubviews] ;
_iconImageView.layer.cornerRadius = _iconImageView.JG_width * 0.5 ;
//超出主層就會(huì)剪切掉
_iconImageView.layer.masksToBounds = YES ;
}
注:這個(gè)要在layoutSubviews里面用,才能設(shè)置寬度;
之前設(shè)置圓角是會(huì)降低幀數(shù),但是親測(cè) iOS9開始cornerRadius不會(huì)對(duì)幀數(shù)有影響,
③runtime直接在xib中添加屬性,不是很推薦使用(因?yàn)椴辉诖a中顯示,不直觀,不利于程序員之間交流)

注:幾個(gè)項(xiàng)目中親測(cè)發(fā)現(xiàn),用runtime或layer層剪切圓形圖片內(nèi)存占用小,位圖上下文占用最大