參考筆者博客或者博客:
[iOS CAShapeLayer & UIBezierPath畫線、畫圖: https://www.cnblogs.com/jaesun/p/iOS-CAShapeLayerUIBezierPath-hua-xian.html
[iOS UIBezierPath貝塞爾曲線常用方法:http://m.itdecent.cn/p/c883fbf52681
一般有四方式進(jìn)行設(shè)置圓角,推薦的放到前面 不推薦的放到最后
第一種方法: CAShapeLayer+貝塞爾曲線(我是 推薦 可以用于UIView所有子類及本類還不增加視圖)

CAShapeLayer+貝塞爾曲線.png
///添加圓角 蒙版 線的路徑
let maskPathIuv = UIBezierPath.init(roundedRect: v.bounds, byRoundingCorners: UIRectCorner.allCorners, cornerRadii: CGSize.init(width: radius, height: radius))
let maskLayerIuv = CAShapeLayer.init()
maskLayerIuv.frame = v.bounds
maskLayerIuv.path = maskPathIuv.cgPath
v.layer.mask = maskLayerIuv
下面是進(jìn)行設(shè)置圓角線
if isLine {///設(shè)置圓角線 設(shè)置線
let maskPathLine = UIBezierPath.init(roundedRect: v.bounds, cornerRadius: radius)
let maskLayerLineIuv = CAShapeLayer.init()
maskLayerLineIuv.frame = v.bounds
maskLayerLineIuv.path = maskPathLine.cgPath
maskLayerLineIuv.strokeColor = lineColor.cgColor
maskLayerLineIuv.lineWidth = 1.0
maskLayerLineIuv.fillColor = nil
v.layer.addSublayer(maskLayerLineIuv)
}
第二和第三種方法: CoreGraphics 繪制

CoreGraphics 繪制 .png
///2. 貝塞爾曲線+CoreGraphics(如果是UIImageView并不是網(wǎng)絡(luò)圖片的時候 推薦)
/*原因是:非UIImageView時 需要在UIView上近添加一個 UIImageView 之后通過上下文畫的圖片設(shè)置給UIImageView*/
//創(chuàng)建新的位圖
//size 新位圖的大小 opaque 透明開關(guān) scale 縮放因子 設(shè)置為0 系統(tǒng)自動匹配
UIGraphicsBeginImageContextWithOptions(self.imvUserAvatar.mj_size, false, 0)
//用貝塞爾曲線畫一個圓形 addClip 進(jìn)行切割
UIBezierPath.init(roundedRect: self.imvUserAvatar.bounds, cornerRadius: self.imvUserAvatar.mj_h/2.0).addClip()
//開始繪圖
self.imvUserAvatar.draw(self.imvUserAvatar.bounds)
self.imvUserAvatar.image = UIGraphicsGetImageFromCurrentImageContext()
//結(jié)束畫圖
UIGraphicsEndImageContext();
///3. CoreGraphics(如果是UIImageView并不是網(wǎng)絡(luò)圖片的時候 推薦)
/*原因是:非UIImageView時 需要在UIView上近添加一個 UIImageView 之后通過上下文畫的圖片設(shè)置給UIImageView*/
UIGraphicsBeginImageContextWithOptions(self.imvUserAvatar.mj_size, false, 0)
//獲取上下文
let ctx = UIGraphicsGetCurrentContext()
//設(shè)置一個范圍
let rect = self.imvUserAvatar.bounds
//給上下文畫一個橢圓
ctx?.addRect(rect)
//裁剪
ctx?.clip()
//開始繪圖
self.imvUserAvatar.draw(self.imvUserAvatar.bounds)
self.imvUserAvatar.image = UIGraphicsGetImageFromCurrentImageContext()
//結(jié)束
UIGraphicsEndImageContext()
直接layer層的設(shè)置,常用方法 下面為主要的代碼(不推薦!!!不推薦!!!不推薦!!!重要的事情寫三遍):

直接layer層的設(shè)置.png
self.imvUserAvatar.layer.masksToBounds = true
self.imvUserAvatar.layer.cornerRadius = self.imvUserAvatar.mj_h/2.0
self.imvUserAvatar.layer.borderWidth = 0.5
self.imvUserAvatar.layer.borderColor = UIColor.colorF2F2F2()?.cgColor
其中的masksToBounds會實(shí)現(xiàn)離屛渲染(GPU會在當(dāng)前屏幕緩沖區(qū)開辟一個新的緩沖區(qū)進(jìn)行工作,這就是離屛渲染),這會給我們帶來額外的性能損耗,如果這樣的圓角操作達(dá)到一定的數(shù)量,會觸發(fā)緩沖區(qū)的頻繁合并和上下文的頻繁切換,性能上宏觀提現(xiàn)是掉幀,不建議使用,iOS9以后系統(tǒng)會判斷,能不產(chǎn)生離屛渲染的就不使用了. 離屏渲染優(yōu)化:http://m.itdecent.cn/p/f247f8c13b32