为什么 'Pie Slice' 中的斜线无法使用 UIBezierPath 正确绘制?

Why Is Angled Line In 'Pie Slice' Not Drawing Correctly With UIBezierPath?

我想画一个 'pie slice' 圆,其中一条边从顶部到中心是垂直的,一条边是从顶点到圆上一点的弧线,最后一条edge 是从圆弧的末端到圆心。

这是我目前使用的代码:

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

当我尝试在给定的矩形内绘制它时,这就是我得到的:

其中绿色部分是我用上面的 class 制作的视图。我喜欢圆弧和垂直线,但我希望只有一条边,即从圆弧右端到圆心的一条线。

我认为你的顶部和中心计算是错误的。

而不是

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)