实现效果如下

前言
公司由于想实现如上的需求,想了很久,于是乎自己实现了一个这样的制作过程。
实现方案如下:
import UIKit
class KBDraw: UIView {
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
myDraw()
}
func myDraw() {
/*
* 这里发现其实压根不需要画中间的线。直接画圆觉弧度 就可以实现了()
*/
let radius :CGFloat = 10
UIColor(r: 255, g: 0, b: 0, a: 100).setFill()
// UIColor.orange.setFill()
UIColor.yellow.setStroke()
let offset :CGFloat = 40
let bezierPath = UIBezierPath()
bezierPath.move(to: CGPoint(x: 10 + offset, y: 10))
bezierPath.addLine(to: CGPoint(x: 100 + offset, y: 10))
bezierPath.addArc(withCenter: CGPoint(x: 100 + offset, y: 10 + radius), radius: radius, startAngle: CGFloat(-Double.pi/2.0), endAngle: 0, clockwise: true)
bezierPath.addArc(withCenter: CGPoint(x: 100 + offset, y: 100), radius: radius, startAngle: 0, endAngle: CGFloat(Double.pi/2.0), clockwise: true)
bezierPath.addArc(withCenter:CGPoint(x: 50 + offset , y: 100 + radius + radius), radius: radius, startAngle: CGFloat(-Double.pi/2.0), endAngle: CGFloat(-Double.pi), clockwise: false)
// bezierPath.addLine(to: CGPoint(x: 50 - radius + offset , y: 140 + radius + radius))
bezierPath.addArc(withCenter:CGPoint(x: 50 - radius - radius + offset , y: 140 + radius + radius), radius: radius, startAngle:0, endAngle: CGFloat(Double.pi/2), clockwise: true)
// bezierPath.addLine(to: CGPoint(x: 10 + offset, y: 140 + radius + radius + radius))
bezierPath.addArc(withCenter: CGPoint(x: 10 + offset - radius, y: 140 + radius + radius ), radius: radius, startAngle: CGFloat(Double.pi/2.0), endAngle: CGFloat(Double.pi), clockwise: true)
// bezierPath.addLine(to: CGPoint(x: 10 + offset - radius - radius, y: 10 + radius))
bezierPath.addArc(withCenter: CGPoint(x: 10 + offset - radius , y: 10 + radius), radius: radius, startAngle: CGFloat(Double.pi), endAngle: CGFloat(Double.pi) * 3 / 2, clockwise: true)
bezierPath.addLine(to: CGPoint(x: 10 + offset, y: 10))
bezierPath.lineWidth = 2.0
bezierPath.setLineDash([3,2], count: 2, phase: 0)
bezierPath.stroke()
bezierPath.fill()
}
}
其实 在本方案中,我发现不必设置中间的直线就可以实现这个效果,也是意外!
浙公网安备 33010602011771号