Почему угловая линия в 'круговом срезе' не рисуется правильно с UIBezierPath? - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь нарисовать «круговую часть» в круге, где один край является вертикальным от вершины до центра, один край - дуга от верхней точки до точки на круге, а последний край отконец дуги к центру.

Вот код, который я использую в данный момент:

class ArcView : UIView {
  override func draw(_ rect: CGRect) {
    let x1 = rect.minX
    let x2 = rect.maxX
    let y1 = rect.minY
    let y2 = rect.maxY

    let arc_radius = self.superview!.frame.width/2
    let delta_y = y2-y1
    let delta_x = x2-x1
    let angle = asin(delta_x/arc_radius)

    let center = CGPoint(x:x1, y:y2)
    let top = CGPoint(x:x1, y:y1)

    //draw path
    let path = UIBezierPath()
    path.move(to: top)
    path.addArc(withCenter: center, radius: arc_radius, startAngle: CGFloat.pi/2, endAngle: angle, clockwise: true)
    path.addLine(to: center)
    path.addLine(to: top)
    path.close()


    UIColor.green.setFill()
    path.fill()

    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.cgPath
    layer.mask = shapeLayer
    }
  }

И когда я пытаюсь нарисовать это в данном прямоугольнике, это то, чтоЯ получаю: Where the green section is the view I am making with the class above.

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

1 Ответ

1 голос
/ 27 октября 2019

Я думаю, что ваш верх и центр неверны.

Вместо

let center = CGPoint(x:x1, y:y2)
let top = CGPoint(x:x1, y:y1)

Попробуйте

let center = CGPoint(x: rect.midX y:rect.midY
let top = CGPoint(x:x1, y:rect.midY)
...