UIBezierPath не одинаково толстый везде и обрезан - PullRequest
1 голос
/ 16 февраля 2020

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

import Foundation
import UIKit

class IndicatingView: UIView {
    var path: UIBezierPath!

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    func createLineWithCurve() {
        path = UIBezierPath()

        path.move(to: CGPoint(x: 0, y: 0))

        path.addLine(to: CGPoint(x: 0, y: self.frame.height - self.frame.width))

        path.addQuadCurve(to: CGPoint(x: self.frame.width, y: self.frame.height), controlPoint: CGPoint(x: 0, y: self.frame.height))
    }

    override func draw(_ rect: CGRect) {
        self.createLineWithCurve()

        path.lineWidth = 3
        // Specify a border (stroke) color.
        UIColor.purple.setStroke()
        path.stroke()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

И вывод, который я получаю, уже выглядит довольно хорошо:

Output

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

Заранее благодарен за помощь:)

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

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

Для вставки следует использовать insetBy(dx:dy:) путь обводки на половину ширины линии, что обеспечит попадание всего обводки в пределах bounds вида. А затем используйте minX, maxX, et c. из этой результирующей вставки CGRect, чтобы выяснить различные CGPoint для вашего пути.

Например:

class IndicatingView: UIView {
    func lineWithCurve() -> UIBezierPath {
        let lineWidth: CGFloat = 3
        let rect = bounds.insetBy(dx: lineWidth / 2, dy: lineWidth / 2)

        let path = UIBezierPath()
        path.lineWidth = lineWidth
        path.lineCapStyle = .square

        path.move(to: CGPoint(x: rect.minX, y: rect.minY))            
        path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY - rect.width))
        path.addQuadCurve(to: CGPoint(x: rect.maxX, y: rect.maxY), controlPoint: CGPoint(x: rect.minX, y: rect.maxY))

        return path
    }

    override func draw(_ rect: CGRect) {
        UIColor.purple.setStroke()
        lineWithCurve().stroke()
    }
}

То есть:

enter image description here

1 голос
/ 16 февраля 2020

здесь вы видите мой «результат» -> я сделал ширину линии немного больше, чем вы можете видеть, она прекрасно рисует;)

Apple dr aws всегда точно в точке, так что если вы рисуете линия шириной 3 в точке 0,0, одна точка -1,0, одна в 0,0 и одна в 1,0

enter image description here

...