Я думаю, что вызов path.close
заставляет все эти прямые линии появляться. Если вам нужна только одна дуга и больше ничего, почему бы не попробовать инициализатор init(arcCenter:radius:startAngle:endAngle:clockwise:)
?
class MyView: UIView {
override func draw(_ rect: CGRect) {
let path = UIBezierPath(arcCenter: CGPoint(x: 100, y: 70), radius: 50, startAngle: -CGFloat.pi, endAngle: 0, clockwise: true)
UIColor.black.setStroke()
path.lineWidth = 10
path.stroke()
}
}
Вы можете создать что-то вроде этого:
Если вы хотите, чтобы разные части дуги были разных цветов, вы, вероятно, захотите запомнить угол, в котором заканчивается предыдущая часть дуги (т.е. сохранить угол в переменной). Вы, кажется, не делаете это в данный момент.
Вот что я смог придумать:
override func draw(_ rect: CGRect) {
var lastArcAngle = -CGFloat.pi
func addArc(color: UIColor, percentage: CGFloat) {
let fullCircle = CGFloat.pi * 2
let arcAngle = fullCircle * percentage
let path = UIBezierPath(arcCenter: CGPoint(x: 100, y: 70), radius: 50, startAngle: lastArcAngle, endAngle: lastArcAngle + arcAngle, clockwise: true)
color.setStroke()
path.lineWidth = 10
path.stroke()
lastArcAngle += arcAngle
}
addArc(color: .red, percentage: 1.0 / 6.0)
addArc(color: .green, percentage: 1.0 / 6.0)
addArc(color: .blue, percentage: 1.0 / 6.0)
}