1. Math
Forget iOS for a moment and solve the math problem.
Task: find (x; y) a point for a given α.
Solution: x = cos (α); y = sin (α)

2. Replacement
Your starting point is not 0 in terms of trigonometry, but rather in π / 2 . Also, your arc angle is determined by the progress parameter, so it leads you to the following:
x = cos (progress * 2 * π + π / 2) = -sin (progress * 2 * π)
y = sin (progress * 2 * π + π / 2) = cos (progress * 2 * π)
3. Now back to iOS:
Since the y axis returns at the beginning of iOS in the upper left corner, you must convert the previous solution this way:
x '= 0.5 * (1 + x)
y '= 0.5 * (1-y)
Green for mathematical coordinates, blue for the iOS coordinate system, which we converted to:

Now all you have to do is multiply the result by width and height:
x '= 0.5 * width * (1 - sin (progress * 2 * π))
y '= 0.5 * height * (1 - cos (stroke * 2 * π))
4. Code:
func point(progress: Double, radius: CGFloat) -> CGPoint { let x = radius * (1 - CGFloat(sin(progress * 2 * Double.pi)))) let y = radius * (1 - CGFloat(cos(progress * 2 * Double.pi)))) return CGPoint(x: x, y: y) }
Edit
If you want to switch it clockwise, just multiply the angle by -1 :
x = cos (-progress * 2 * π + π / 2) = -sin (-progress * 2 * π) = sin (progress * 2 * π)
y = sin (-progress * 2 * π + π / 2) = cos (-progress * 2 * π) = cos (progress * 2 * π)
x '= 0.5 * width * (1 + sin (progress * 2 * π))
y '= 0.5 * height * (1 - cos (stroke * 2 * π))
func point(progress: Double, radius: CGFloat) -> CGPoint { let x = radius * (1 + CGFloat(sin(progress * 2 * Double.pi)))) let y = radius * (1 - CGFloat(cos(progress * 2 * Double.pi)))) return CGPoint(x: x, y: y) }
Hope this helps.