Я все еще надеюсь получить ответ на вопрос (ы) ниже. Для ясности я добавил несколько комментариев.
Приведенный ниже код генерирует различные сегменты окружности через пути (Безье), которые вместе объединяются через ZStack в одно изображение из 3 окружностей с 25% -ным разрезом. вне. Я хочу дать каждому сегменту разный цвет, в зависимости от значения i и j (всего 9).
Это кажется невозможным: как изменение цвета переднего плана в структуре Contentview, так и в GeometryReader не оказывает никакого влияния. Любые идеи, как это сделать?
Второй вопрос: я пытался использовать команду «switch», но компилятор жалуется, что «Закрытие, содержащее оператор потока управления, не может быть использовано с компоновщиком функций« ViewBuilder »». Мне кажется очень странным, что нельзя использовать управление потоком. Что я пропускаю или делаю неправильно?
struct ContentView: View {
static let segmentCount = 4
static let circleCount = 4
var body: some View {
ZStack {
ForEach(1..<ContentView.circleCount){ j in
ForEach(1..<ContentView.segmentCount){i in
GeometryReader { geometry in
arcShape(i: i, j: j)
.scaleEffect(4.0 / 4.0, anchor: .top)
.foregroundColor(Color(red: (79.0 + Double(j) ) / 255, green: 79.0 / 255, blue: 191.0 / 255))
}
}
}
}
}
}
struct arcShape: View {
let i: Int
let j: Int
static let arcColor2 = Color(red: 79.0 / 255, green: 79.0 / 255, blue: 191.0 / 255)
static let arcColor3 = Color(red: 79.0 / 255, green: 120.0 / 255, blue: 191.0 / 255)
// Create new path
var body: some View {
GeometryReader { geometry in
Path {path in
let center_x = CGFloat(200.0)
let center_y = CGFloat(200.0)
let r = CGFloat(50.0 + (CGFloat(self.j) - 1.0) * 50.0)
let arc_start = CGFloat((45.0 + (CGFloat(self.i) - 1.0) * 90.0)) * CGFloat(Double.pi) / 180.0
let arc_length = CGFloat(90.0 * CGFloat(Double.pi) / 180.0)
let arc_width = CGFloat(25.0)
let line0Target_x = center_x + r * CGFloat(cos(Double(arc_start)))
let line0Target_y = center_y + r * CGFloat(sin(Double(arc_start)))
let line1Target_x = center_x + (r + arc_width) * CGFloat(cos(Double(arc_start + arc_length)))
let line1Target_y = center_x + (r + arc_width) * CGFloat(sin(Double(arc_start + arc_length)))
let arcColor1 = Color(red: (79.0 + Double(self.i) * 10.0) / 255, green: 79.0 / 255, blue: 79.0 / 255)
path.move(to: CGPoint(x: line0Target_x, y: line0Target_y))
path.addArc(center: CGPoint(x: center_x, y: center_y), radius: r, startAngle: Angle(radians: Double(arc_start)), endAngle: Angle(radians: Double(arc_start + arc_length)), clockwise: false)
path.addLine(to: CGPoint(x: line1Target_x, y: line1Target_y))
path.addArc(center: CGPoint(x: center_x, y: center_y), radius: (r + arc_width), startAngle: Angle(radians: Double(arc_start + arc_length)), endAngle: Angle(radians: Double(arc_start)), clockwise: true)
path.addLine(to: CGPoint(x: line0Target_x, y: line0Target_y))
path.foregroundColor(arcColor1)
}
.foregroundColor(Color.green)
// .border(Color.red, width: 8)
// switch i {
// case 1: .fill(Self.arcColor1)
// case 2: .fill(Self.arcColor2)
// case 3: .fill(Self.arcColor3)
// }
}
}
}