Swift 5.0 如何通过 CAShapeLayer 以点开始和结束一行

How to start and end a line with dot through CAShapeLayer in Swift 5.0

如何用点开始和结束一行,如下图所示:

我可以画圈,但我不知道如何在行首和行尾添加点:

let arcCenter = CGPoint(x: vwCircle.frame.width / 2,
                        y: vwCircle.frame.height / 2)

let circlePath = UIBezierPath(arcCenter: arcCenter,
                                 radius: 15,
                             startAngle: 0,
                               endAngle: CGFloat(Double.pi),
                              clockwise: true)

shapeLayer = CAShapeLayer()
shapeLayer!.path = circlePath.cgPath

//change the fill color
shapeLayer!.fillColor = UIColor.clear.cgColor
//you can change the stroke color
shapeLayer!.strokeColor = UIColor.red.cgColor
//you can change the line width
shapeLayer!.lineWidth = 3.0

vwCircle.layer.addSublayer(shapeLayer!)

最简单的方法(因此也是我的方法)就是使用更多的形状图层。对于每个点,制作一个形状层,其形状是中心的一个点。然后添加该层并将其旋转变换到您希望它移动的角度,然后平移变换到圆的半径。

所以,那幅画实际上是三个形状层:外圈、一个点和另一个点。顶部的点是这样创建的:

let angle : CGFloat = .pi * 2 * 3 / 4
// ...
let lay = CAShapeLayer()
lay.frame = circleLayer.bounds
lay.strokeColor = UIColor.black.cgColor
lay.fillColor = UIColor.black.cgColor
let dot = UIBezierPath(
    arcCenter: CGPoint(x: circleLayer.bounds.midX, y: circleLayer.bounds.midY), 
    radius: 3, startAngle: 0, endAngle: .pi*2.0, clockwise: true)
lay.path = dot.cgPath
circleLayer.addSublayer(lay)
// and now add the transform
lay.transform = CATransform3DMakeRotation(angle, 0, 0, 1)
lay.transform = CATransform3DTranslate(lay.transform, circleRadius, 0, 0)

通过更改值 .pi * 2 * 3 / 4,您可以将圆点放在圆上任何您喜欢的位置。