Полукруг Swift Draw, не заполнен - PullRequest
0 голосов
/ 29 июня 2018

Полагаю, я делаю что-то ужасно неправильное, но мне нужно представить вам мою идею. Я хочу нарисовать что-то вроде полукруга около 180 градусов, который имеет три разных цвета. Но я не хочу, чтобы это было заполнено, я просто хочу, чтобы это был сам круг. Я использую этот код:

func addCirc(colour: UIColor, perc: CGFloat) {
    let center = CGPoint(x: 150, y:150)
    let radius = min(200, 200) / 2
    let startAngle = 0 / 100 * CGFloat(Double.pi) * 2 - CGFloat(Double.pi)
    let endAngle = perc / 100 * CGFloat(Double.pi) * 2 - CGFloat(Double.pi)
    let path = UIBezierPath()
    path.move(to: center)
    path.addArc(withCenter: center, radius: CGFloat(radius), startAngle: startAngle, endAngle: endAngle, clockwise: true)
    colour.setStroke()
    path.close()
    path.lineWidth = 20
    path.stroke()
}

let leftColour = UIColor.red
let middleColour = UIColor.yellow
let rightColour = UIColor.green
addCirc(colour: rightColour, perc: 50)
addCirc(colour: middleColour, perc: 30)
addCirc(colour: leftColour, perc: 10)

Результат выглядит следующим образом: enter image description here

Так что я просто хочу иметь сам круг и удалить нижнюю линию и диагональные. Я думаю, что неправильно использовать addArc в этой ситуации. Кто-нибудь знает альтернативу для ее решения?

1 Ответ

0 голосов
/ 29 июня 2018

Я думаю, что вызов 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()
    }
}

Вы можете создать что-то вроде этого:

enter image description here

Если вы хотите, чтобы разные части дуги были разных цветов, вы, вероятно, захотите запомнить угол, в котором заканчивается предыдущая часть дуги (т.е. сохранить угол в переменной). Вы, кажется, не делаете это в данный момент.

Вот что я смог придумать:

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)
}
...