Swift 如何在没有连接线的情况下绘制两条圆弧路径?

Swift 如何在没有连接线的情况下绘制两条圆弧路径?,swift,core-graphics,cgpath,Swift,Core Graphics,Cgpath,我正在使用CGMutablePath绘制wifi徽标。当我通过addArc(中心:半径:startAngle:endAngle:顺时针:transform:)绘制第二条圆弧时,它会自动绘制一条与指定文档类似的直线。如果路径已经包含子路径,此方法会添加一条将当前点连接到圆弧起点的直线。。没有这条线我怎么画画?谢谢在添加第二个圆弧之前,只需使用移动(到:变换:)。查看更多详细信息。在添加第二个圆弧之前,只需使用move(to:transform:)。查看更多详细信息。是的,El Tomato告诉了您

我正在使用
CGMutablePath
绘制wifi徽标。当我通过addArc(中心:半径:startAngle:endAngle:顺时针:transform:)绘制第二条圆弧时,它会自动绘制一条与指定文档类似的直线
。如果路径已经包含子路径,此方法会添加一条将当前点连接到圆弧起点的直线。
。没有这条线我怎么画画?谢谢

在添加第二个圆弧之前,只需使用
移动(到:变换:)
。查看更多详细信息。

在添加第二个圆弧之前,只需使用
move(to:transform:)
。查看更多详细信息。

是的,El Tomato告诉了您需要做什么。由于
addArc(中心:半径:startAngle:endAngle:顺时针:transform:)
从路径中的最后一点到圆弧起点绘制一条线,因此需要使用
move(to:transform:)
在添加新圆弧之前先移动到新圆弧的起点

如果
addArc(中心:半径:startAngle:endAngle:顺时针:transform:)
使用一个标志来控制它是否将一条线绘制到它的起点,这会很好,但它似乎没有


计算起点需要一点三角。

是的,El Tomato告诉了你需要做什么。由于
addArc(中心:半径:startAngle:endAngle:顺时针:transform:)
从路径中的最后一点到圆弧起点绘制一条线,因此需要使用
move(to:transform:)
在添加新圆弧之前先移动到新圆弧的起点

如果
addArc(中心:半径:startAngle:endAngle:顺时针:transform:)
使用一个标志来控制它是否将一条线绘制到它的起点,这会很好,但它似乎没有


计算起点将涉及一点三角。

如果要绘制一条没有上一点直线的圆弧,则需要在添加圆弧之前使用
move(to:)
-将路径移动到圆弧起点。弧的起点可计算为:

center.x + radius * cos(startAngle)
center.y + radius * sin(startAngle)
您可以利用CGPath创建笔划副本的功能,而不是自己计算点来创建每个圆弧的轮廓。执行此操作时,只需为图标的每个“条”创建带有一个圆弧的基本路径:

let basePath = CGMutablePath()

let center     = CGPoint.zero
let startAngle = CGFloat.pi * 0.75 // 135 degrees
let endAngle   = CGFloat.pi * 0.25 //  45 degrees

let radii: [CGFloat] = [10, 20, 30, 40]

for radius in radii {
    // Move to the start point of the arc
    basePath.move(to: CGPoint(x: center.x + radius * cos(startAngle),
                              y: center.y + radius * sin(startAngle)))
    // Add the arc, starting at that same point
    basePath.addArc(center: center, radius: radius,
                    startAngle: startAngle, endAngle: endAngle,
                    clockwise: true)
}
这将创建这样的基础形状,没有任何厚度:

接下来,通过笔划创建基本路径的副本。您可以在此处配置图标条的厚度及其端点的样式(方形或圆形):

形成如下形状:


如果要绘制一条不带上一点直线的圆弧,则需要在添加圆弧之前使用
move(to:)
-将路径移动到圆弧的起点。弧的起点可计算为:

center.x + radius * cos(startAngle)
center.y + radius * sin(startAngle)
您可以利用CGPath创建笔划副本的功能,而不是自己计算点来创建每个圆弧的轮廓。执行此操作时,只需为图标的每个“条”创建带有一个圆弧的基本路径:

let basePath = CGMutablePath()

let center     = CGPoint.zero
let startAngle = CGFloat.pi * 0.75 // 135 degrees
let endAngle   = CGFloat.pi * 0.25 //  45 degrees

let radii: [CGFloat] = [10, 20, 30, 40]

for radius in radii {
    // Move to the start point of the arc
    basePath.move(to: CGPoint(x: center.x + radius * cos(startAngle),
                              y: center.y + radius * sin(startAngle)))
    // Add the arc, starting at that same point
    basePath.addArc(center: center, radius: radius,
                    startAngle: startAngle, endAngle: endAngle,
                    clockwise: true)
}
这将创建这样的基础形状,没有任何厚度:

接下来,通过笔划创建基本路径的副本。您可以在此处配置图标条的厚度及其端点的样式(方形或圆形):

形成如下形状:


移动该点。@ElTomato所以我必须计算下一条弧路径的起点并移动到下一点?我不太清楚,因为您没有显示一行代码。但这不只是移动弧中心的问题吗?另外,我不是一个真正的iOS用户。移动点。@ElTomato所以我必须计算下一条弧路径的起点并移动到下一个点?我不太清楚,因为你没有显示一行代码。但这不只是移动弧中心的问题吗?另外,我不是一个真正喜欢iOS的人。回答得很好。(投票)你是为这个问题编写了代码,还是手头有?我注意到的一件事是,你的示例代码假设所有圆弧的中心点都是CGPoint.zero。如果使用任意的中心点来编写它不是更有用吗?我修改了一些我手头的Bezier路径代码,并在操场上拍摄了UIBezier路径预览的屏幕截图。回答得很好。(投票)你是为这个问题编写了代码,还是手头有?我注意到的一件事是,你的示例代码假设所有圆弧的中心点都是CGPoint.zero。用任意的中心点来编写它不是更有用吗?我修改了一些我手头的Bezier路径代码,并在那个操场上拍摄了UIBezier路径预览的屏幕截图。