iOS CAShapeLayer & UIBezierPath畫線、畫圖

參考筆者博客或者博客:

[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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容