iOS UIView设置各个圆角不同大小

2,740 阅读1分钟

定义各圆角大小的结构体,默认为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

效果图