UIBezierPath с несколькими путями, не соединяющими линии с типом скоса - PullRequest
1 голос
/ 28 января 2020

Возможно, это простая ошибка, но я не могу понять, что происходит.

У меня есть 3 UIBezierPath, которые я объединяю в 1. Я хочу, чтобы любой конец пути имел закругленный край, с средний путь, чтобы иметь линию скосаJoinStyle. Тем не менее, последний путь, кажется, имеет закругленную линию JoinStyle, которую я не могу исправить.

Вот изображение того, что я имею в виду.

enter image description here

Вот код, который я использую:

    override func draw(_ rect: CGRect) {

        let leftQuarterPoint: CGPoint = CGPoint(x: 15, y: rect.height / 2)
        let rightQuarterPoint: CGPoint = CGPoint(x: (rect.width - (rect.width / 4)), y: rect.height / 2)
        let leftPath = UIBezierPath()
        leftPath.move(to: leftQuarterPoint)
        let firstPoint = CGPoint(x: rect.width / 4, y: rightQuarterPoint.y)
        Global.Colors.red.setStroke()

        leftPath.addCurve(to: firstPoint, controlPoint1: CGPoint(x: leftQuarterPoint.x, y: rightQuarterPoint.y), controlPoint2: CGPoint(x: firstPoint.x, y: firstPoint.y))
        leftPath.lineWidth = 20
        leftPath.lineCapStyle = .round
        leftPath.stroke()


        let middlePath = UIBezierPath()

        Global.Colors.orange.setStroke()
        middlePath.move(to: leftPath.currentPoint)
        middlePath.addCurve(to: rightQuarterPoint, controlPoint1: CGPoint(x: rect.width / 2, y: rect.height / 2), controlPoint2: CGPoint(x: rect.width / 2, y: rect.height / 2))
        middlePath.lineWidth = 20
        middlePath.lineCapStyle = .square
        middlePath.lineJoinStyle = .bevel
        middlePath.stroke()


        let rightPath = UIBezierPath()
        Global.Colors.green.setStroke()

        rightPath.move(to: middlePath.currentPoint)

        rightPath.addCurve(to: CGPoint(x: rect.width - 15, y: (rect.height / 2)), controlPoint1: CGPoint(x: rightQuarterPoint.x, y: rightQuarterPoint.y), controlPoint2: CGPoint(x: rect.width-15, y: rect.height / 2))
        rightPath.lineWidth = 20
        rightPath.lineCapStyle = .round
        rightPath.lineJoinStyle = .bevel
        rightPath.stroke()

        let path = UIBezierPath()


        path.append(leftPath)
        path.append(middlePath)
        path.append(rightPath)


        path.lineWidth = 20

    }

Извините, если мне не хватает чего-то простого.

Ответы [ 2 ]

4 голосов
/ 28 января 2020

Удаление этих строк из кода и добавление их в конец розыгрыша c будет работать для вас, причина в том, что боковые пути округлены, но они перекрываются со средней, поэтому, если вы сначала дроу стороны, а затем нарисуйте средний, он скроет закругленные углы.

override func draw(_ rect: CGRect) {

       ...

        Global.Colors.green.setStroke()
        rightPath.stroke()

        Global.Colors.red.setStroke()
        leftPath.stroke()

        Global.Colors.orange.setStroke()
        middlePath.stroke()
}
3 голосов
/ 28 января 2020

Ваш правильный путь перекрывает средний. просто начните рисовать правильный путь после окончания среднего. Замените rightPath.move этой строкой. 15 будет значением, которое вы хотите начать рисовать правильный путь.

rightPath.move(to: CGPoint(x: middlePath.currentPoint.x + 15, y: middlePath.currentPoint.y))
...