iOS - CornerRadius的正確姿勢

iOS設置圓角的時候錯誤的方式會造成離屏幕渲染

m.layer.cornerRadius = 8
m.layer.borderColor = UIColor.redColor().CGColor
m.layer.masksToBounds = true //這句會早成離屏渲染,造成屏幕卡頓

目前測試可解決UIImageView、UILabel和UIButton的情況

class CornerRadiusLayer:CALayer  {
    
    
    override func display() {
        self.contentsScale = UIScreen.mainScreen().scale
        super.display()
    }
    
    var sborderWidth: CGFloat?
    
    var scornerRadius: CGFloat?
    
    var sborderColor:UIColor?
    
    override func drawInContext(ctx: CGContext) {
        
        
        //將背景色填充為父視圖的顏色
        CGContextSaveGState(ctx)
        CGContextAddRect(ctx, self.bounds)
        let fillBackGroundColor = (self.delegate as! UIView).superview?.backgroundColor ?? UIColor.whiteColor()
        CGContextSetFillColorWithColor(ctx,fillBackGroundColor.CGColor)
        CGContextFillPath(ctx)
        CGContextRestoreGState(ctx)
        
        //從運行時取出參數變量
        let tcornerRadius:CGFloat   = self.scornerRadius ?? 0
        let tborderWidth:CGFloat    = self.sborderWidth ?? 0
        let tborderColor:UIColor    = self.sborderColor ?? UIColor.whiteColor()
        
        //設置圓角的Bezier曲線
        let pp = UIBezierPath(roundedRect: self.bounds, cornerRadius: tcornerRadius + tborderWidth)
        
        //填充背景色
        CGContextSaveGState(ctx)
        CGContextBeginPath(ctx)
        CGContextAddPath(ctx, pp.CGPath)
        CGContextSetFillColorWithColor(ctx, (self.delegate as! UIView).backgroundColor?.CGColor)
        CGContextFillPath(ctx)
        CGContextRestoreGState(ctx)
        
        //切掉外圍
        CGContextSaveGState(ctx)
        CGContextBeginPath(ctx)
        CGContextAddPath(ctx, pp.CGPath)
        CGContextClip(ctx)
        
        
        
        //如果是圖片還得繪制圖片
        if let image = (self.delegate as? UIImageView)?.image{
            CGContextDrawImage(ctx, self.bounds, image.CGImage)
        }else{
            //繪制內容
            super.drawInContext(ctx)
        }
        
        //繪制邊框
        CGContextSetStrokeColorWithColor(ctx, tborderColor.CGColor)
        
        CGContextAddPath(ctx, pp.CGPath)
        
        CGContextSetLineWidth(ctx, tborderWidth)
        
        CGContextStrokePath(ctx)

    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容