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)
}
}