隐藏UIBezierPath的一部分

时间:2017-08-04 23:16:42

标签: ios swift uibezierpath

我有3个UIBezierPath,有2个圆圈,一条线从1个圆圈的中心到另一个圆圈,看起来像是底部的图片。我想隐藏圆圈内部的部分,如顶部图片。有没有简单的方法来做到这一点?

我的策略是从中心画一条不可见的线,然后从2个圆的圆周画一条黑线,因为我知道斜坡等,但看起来似乎太多了。 enter image description here

    private func pathForBoxCircle1() -> UIBezierPath {

        let circlePath = UIBezierPath(arcCenter:circle1BoxCurrentCenter, radius: 25, startAngle: 0.0, endAngle: CGFloat(2*M_PI), clockwise: false)
        //circlePath.fill()
        pathBoxCircle1Global = circlePath

        return circlePath
    }

    private func pathForBoxCircle2() -> UIBezierPath {

        let circlePath = UIBezierPath(arcCenter:circle2BoxCurrentCenter, radius: 25, startAngle: 0.0, endAngle: CGFloat(2*M_PI), clockwise: false)
        //circlePath.fill()
        pathBoxCircle2Global = circlePath

        return circlePath
    }
    private func pathForHorizonLine() -> UIBezierPath {
        let path = UIBezierPath()
        path.move(to: circle1BoxCurrentCenter)
        path.addLine(to: circle2BoxCurrentCenter)
        path.lineWidth = 5.0
        //pathHorizonLineGlobal = path


        return path
    }

    override func draw(_ rect: CGRect) {

        pathForBoxCircle1().stroke()
        pathForBoxCircle2().stroke() // same as stroke()
        pathForHorizonLine().stroke()


    }

1 个答案:

答案 0 :(得分:1)

您无法将相同形状的透明线和不透明线混合在一起。您将不得不绘制2个圆,然后从第一个圆的外部到第二个圆的外部绘制线段。

要做到这一点,你需要触发或者毕达哥拉斯来计算连接线与你的2个圆相交的点的坐标。

如果C1是你的第一个圆,C2是你的第二个圆,C1是(C1.x,C1.y),C2是(C2.x,C2.y),C1的半径是R1, C2的半径是R2,那么伪代码看起来像这样:

angle1 = atan2(C1.y - C2y, C1.x - C2.x)

angle2 = atan2(C2.y - C1.y, C2.x - C1.x)

xOffset1 = R1 * cos(angle1)
yOffset1 = R1 * sin(angle1)

point1 = (C1.x + xOffset1, C1.y + yOffset1)

xOffset2 = R2 * cos(angle2)
yOffset2 = R2 * sin(angle2)

point2 = (C2.x + xOffset2, C2.y +  yOffset2)

绘制圆圈,然后在point1和point2之间绘制线条。

(请注意,我的触发器有点生锈,我在一张草稿纸上勾画出来。我认为这是正确的,但它完全没有经过测试。)