привет, я бы хотел добиться такого пользовательского интерфейса

однако пока мне удается сделать это только так

вот мой полный код, в котором я пытался этого добиться
struct Wave: Shape { вар animatableData: Double { получить {фазу} установить { self.phase = newValue } } Сила вар: Двойная Частота вар: Двойная переменная фаза: двойная переменная криваяAmount: Double путь функции (в прямоугольнике: CGRect) -> Путь { вар путь = Путь() пусть ширина = Double(rect.width) пусть высота = Double (rect.height) пусть MidWidth = ширина / 2 пусть MidHeight = высота / 2 пусть start = CGPoint (x: rect.minX, y: MidHeight) let end = CGPoint(x: rect.maxX, y: MidHeight) let control = CGPoint(x: MidWidth, y: rect.minY + Strength * CurveAmount) path.move(к: начало) для x в шаге (от: 0, через: ширина, на: 1) { пусть прогресс = x/ширина let parabolicY = QuadBezier(t: прогресс, начало: start.y, c: control.y, конец: end.y) пусть sineWave = sin(прогресс * частота * 2 * .pi + фаза) * (сила * 0,5) пусть y = параболическийY + синусоида path.addLine(to: CGPoint(x: x, y: y)) } Обратный путь } частная функция QuadBezier(t: Double, start: CGFloat, c: CGFloat, end: CGFloat) -> Double { пусть invT = 1 - t пусть b1 = 3*t*(инвТ*инвТ) пусть b2 = 3*(t*t)*invT пусть b3 = t*t*t let part1 = Double(start) * Double(invT * invT * invT) пусть часть2 = Double(c) * Double(b1 + b2) пусть часть3 = Double(конец) * Double(b3) вернуть часть1 + часть2 + часть3 } } struct ContentView: Просмотр { @State частная переменная фаза = 0,0
var body: some View { ZStack { ForEach(0..