У меня есть демонстрационная версия, чтобы проиллюстрировать мой вопрос, вы можете проверить это ниже. Я хочу, чтобы этот SwipeBar изменял цвет фона основного ContentView, но я не знаю, как это сделать. Ранее я использовал ObservableObject для выполнения sh чего-то похожего, но View не может иметь тип ObservableObject, поэтому я не уверен, как этот SwipeBar «общается» с ContentView, который его создал. Любые способы сделать это?
Быстрый просмотр того, что делает этот код: https://imgur.com/gallery/JhomUmu
Весь ContentView.swift:
import SwiftUI
struct ContentView: View {
@State var backGroundColor: Color = .purple
var body: some View {
VStack {
Spacer()
SwipeBar()
Spacer()
}.background(backGroundColor)
}
func changeBackgroundColor(color: Color) {
self.backGroundColor = color
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Весь SwipeBar.swift:
import SwiftUI
struct SwipeBar: View {
@State var draggedOffset = CGSize.zero
@State var greenOpacityLevel: Double = 0.3
@State var redOpacityLevel: Double = 0.3
var body: some View {
ZStack {
ZStack {
HStack {
ZStack {
RoundedRectangle(cornerRadius: 30, style: .continuous)
.fill(Color.green)
.frame(width: 100, height: 70)
Text("GREEN")
.padding(10)
.foregroundColor(.white)
.font(.system(size: 25))
}.padding(.leading, 20)
.opacity(self.greenOpacityLevel)
Spacer()
ZStack {
RoundedRectangle(cornerRadius: 30, style: .continuous)
.fill(Color.red)
.frame(width: 100, height: 70)
Text("RED")
.padding(10)
.foregroundColor(.white)
.font(.system(size: 25))
}.padding(.trailing, 20)
.opacity(self.redOpacityLevel)
}
ZStack {
RoundedRectangle(cornerRadius: 30, style: .continuous)
.fill(Color.blue)
.frame(width: 375, height: 70)
Text("SWIPE LEFT OR RIGHT")
.foregroundColor(.white)
.font(.system(size: 20))
}
.offset(x: self.draggedOffset.width)
.gesture(DragGesture(minimumDistance: 20, coordinateSpace: .local)
.onChanged { value in
self.draggedOffset = value.translation
if self.draggedOffset.width >= 120 {
self.greenOpacityLevel = 1.0
self.draggedOffset.width = 120
} else {
self.greenOpacityLevel = 0.4
}
if self.draggedOffset.width <= -120 {
self.redOpacityLevel = 1.0
self.draggedOffset.width = -120
} else {
self.redOpacityLevel = 0.4
}
}
.onEnded { value in
if self.draggedOffset.width <= -120 {
// Call the ContentView's changeBackGround function and pass in Color.red
print("background should change to red")
}
if self.draggedOffset.width >= 120 {
// Call the ContentView's changeBackGround function and pass in Color.green
print("background should change to green")
}
self.draggedOffset = CGSize.zero
self.redOpacityLevel = 0.4
self.greenOpacityLevel = 0.4
}
)
}
}
}
}
Настоящий вопрос заключается в последней части кода. Как вызвать функцию ContentView для изменения цвета фона?
if self.draggedOffset.width <= -120 {
// Call the ContentView's changeBackGround function and pass in Color.red
print("background should change to red")
}
if self.draggedOffset.width >= 120 {
// Call the ContentView's changeBackGround function and pass in Color.green
print("background should change to green")
}