我正在尝试制作类似于图片中所示的图表。
下面的代码很好,但我真的很想用内边框绘制每个楔形图的边框(而不是居中绘制):
import SwiftUI
struct WedgeShape: Shape {
var startAngle: Angle
var endAngle: Angle
func path(in rect: CGRect) -> Path {
var p = Path()
p.addArc(
center: CGPoint(x: rect.size.width/2, y: rect.size.width/2),
radius: rect.size.width/2,
startAngle: startAngle,
endAngle: endAngle,
clockwise: false
)
return p
}
}
struct Wedge {
var startAngle: Double
var endAngle: Double
var color: Color
}
struct ContentView: View {
var wedges = [
Wedge(startAngle: 0, endAngle: 90, color: Color.red),
Wedge(startAngle: 90, endAngle: 180, color: Color.green),
Wedge(startAngle: 180, endAngle: 360, color: Color.blue)
]
var body: some View {
ZStack {
ForEach(0 ..< wedges.count) {
WedgeShape(
startAngle: Angle(degrees: self.wedges[$0].startAngle),
endAngle: Angle(degrees: self.wedges[$0].endAngle)
)
.stroke(self.wedges[$0].color, lineWidth: 44)
}
}
}
}
我知道可以通过调整视图的框架来处理笔画。 但是,我想要像 Circle().strokeBorder(Color.green, lineWidth: 44)
这样的结果,其中笔画已经被考虑在内了。 InsettableShape
协议似乎对此有帮助,但我不确定如何使用 inset(by:)
方法。
progress
可能更容易。但是这个答案的注意事项是,为了实现我问题中的图像,数据需要按降序排序(以防止较大的值覆盖较小的值)。根据您想要的内容,可能还需要旋转。 - JWK