定义各圆角大小的结构体,默认为0
struct CornerRadii {
var topLeft :CGFloat = 0
var topRight :CGFloat = 0
var bottomLeft :CGFloat = 0
var bottomRight :CGFloat = 0
}
切圆角函数绘制线条
func createPathWithRoundedRect( bounds:CGRect,cornerRadii:CornerRadii) -> CGPath{
let minX = bounds.minX
let minY = bounds.minY
let maxX = bounds.maxX
let maxY = bounds.maxY
//获取四个圆心
let topLeftCenterX = minX + cornerRadii.topLeft
let topLeftCenterY = minY + cornerRadii.topLeft
let topRightCenterX = maxX - cornerRadii.topRight
let topRightCenterY = minY + cornerRadii.topRight
let bottomLeftCenterX = minX + cornerRadii.bottomLeft
let bottomLeftCenterY = maxY - cornerRadii.bottomLeft
let bottomRightCenterX = maxX - cornerRadii.bottomRight
let bottomRightCenterY = maxY - cornerRadii.bottomRight
//虽然顺时针参数是YES,在iOS中的UIView中,这里实际是逆时针
let path :CGMutablePath = CGMutablePath();
//顶 左
path.addArc(center: CGPoint(x: topLeftCenterX, y: topLeftCenterY), radius: cornerRadii.topLeft, startAngle: CGFloat.pi, endAngle: CGFloat.pi * 3 / 2, clockwise: false)
//顶右
path.addArc(center: CGPoint(x: topRightCenterX, y: topRightCenterY), radius: cornerRadii.topRight, startAngle: CGFloat.pi * 3 / 2, endAngle: 0, clockwise: false)
//底右
path.addArc(center: CGPoint(x: bottomRightCenterX, y: bottomRightCenterY), radius: cornerRadii.bottomRight, startAngle: 0, endAngle: CGFloat.pi / 2, clockwise: false)
//底左
path.addArc(center: CGPoint(x: bottomLeftCenterX, y: bottomLeftCenterY), radius: cornerRadii.bottomLeft, startAngle: CGFloat.pi / 2, endAngle: CGFloat.pi, clockwise: false)
path.closeSubpath();
return path
}
方法调用
let myView = UIView.init(frame: .init(x: 0, y: 0, width: 100, height: 40))
myView.center = self.view.center
myView.backgroundColor = UIColor.red
self.view.addSubview(myView)
let cornerRadii = CornerRadii.init(topLeft: 20, topRight: 0, bottomLeft: 20, bottomRight: 40)
let shapLayer = CAShapeLayer()
shapLayer.frame = myView.bounds
shapLayer.path = self.createPathWithRoundedRect(bounds: myView.bounds, cornerRadii: cornerRadii)
myView.layer.mask = shapLayer
效果图