swift - 使用 ForEach 循环在 Swift 中绘制具有不同颜色的同心圆
问题描述
我正在使用SwiftUI
并且我想使用一个ForEach
循环来绘制同心圆,以调整用 . 突出显示的圆Slider
。当我运行以下代码时,我得到一个红色的圆圈,而我应该让第二个圆圈为蓝色,因为它Stepper
是 2.0。如何根据滑块的值更新视图的颜色。我还没有费心添加滑块,因为我想首先获得一个恒定值。有谁知道如何将这些同心圆堆叠在一起,其中一个显示与其他颜色不同的颜色,具体取决于变量的值?
import SwiftUI
struct CircleView: View {
@State var color = Color.red
@State var stepperSelector = 2.0
var body: some View {
ZStack {
ForEach((0...5), id: \.self) { x in
Path { path in
var center = (x: 187, y:240)
var radius = Double(185) - Double(x) * Double(185 / 7)
let factor = Double(Int(radius)) / 5
path.move(to: CGPoint(x: center.x + Int(radius), y: center.y))
for i in stride(from: 0, to: 361, by: 1){
let center = CGPoint(x: 187, y: 240)
let i = Double(i)
let radians = i * Double.pi / 180
let x = radius * cos(radians) + Double(center.x)
let y = radius * sin(radians) + Double(center.y)
path.addLine(to: CGPoint(x: x, y: y))
}
}
.fill(self.color)
.onAppear{
if Int(self.stepperSelector) == Int(x) {
self.color = Color.blue
} else {
self.color = Color.red
}
}
}
}
}
}
struct CircleView_Previews: PreviewProvider {
static var previews: some View {
CircleView()
}
}
解决方案
.fill
将填充路径的内部,这就是输出单个红色圆圈的原因。此外,您可以在不使用单独的状态变量的情况下切换颜色内联。
struct CircleView: View {
@State var stepperSelector = 2.0
var body: some View {
ZStack {
ForEach((0...5), id: \.self) { x in
Path { path in
let center = (x: 187, y: 240)
let radius = Double(185) - Double(x) * Double(185 / 7)
path.move(to: CGPoint(x: center.x + Int(radius), y: center.y))
for i in stride(from: 0, to: 361, by: 1){
let center = CGPoint(x: 187, y: 240)
let i = Double(i)
let radians = i * Double.pi / 180
let x = radius * cos(radians) + Double(center.x)
let y = radius * sin(radians) + Double(center.y)
path.addLine(to: CGPoint(x: x, y: y))
}
}
.stroke(Int(self.stepperSelector) == Int(x) ? Color.blue : Color.red)
}
}
}
}
推荐阅读
- typescript - 添加@types/react-select 后输入错误
- c# - 使用 TryValidateModel 的问题
- javascript - 如何在点击按钮时产生这种悬停效果?
- javascript - 设置用户代理并发布
- javascript - 如何使用我自己的自定义下拉菜单控制 DataTables 生成的选择菜单?
- android - 为什么 jcenter()、maven()、google() 的位置在 build.gradle 中很重要
- android - 将 WordPress 网站转换为 PWA
- python - 避免多重嵌套 for 循环
- python - TensorFlow:NotFoundError:资源匿名迭代器错误
- javascript - 是否有一种 ES6 方法可以在数组中搜索具有来自另一个数组的元素的元素?