Erkennen Sie die sich ändernde Position der Unteransicht dynamisch in SwiftUI
Posted: 06 Jan 2025, 21:23
Ich habe den folgenden Code, in dem ich die Y-Position eines Rechtecks mit einem Timer aktualisiere. Wie kann ich angesichts der folgenden Ansichtshierarchie und ohne Verwendung absoluter Positionen erkennen, sobald sie über die lineView hinausgeht, bei der es sich um eine Unteransicht handelt?
Code: Select all
struct ColorView: View {
private let blockWidth = 40.0
private let blockHeight = 40.0
@State private var blockYPos = 0.0
private let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
GeometryReader { geometry in
ZStack {
// position updated via timer
Rectangle()
.frame(width: blockWidth, height: blockHeight)
.position(x: geometry.size.width/2, y: blockYPos)
VStack {
HStack {
scribble
Spacer()
close
}
.font(.title)
.frame(height: 40)
palleteView
lineView
Spacer()
}
}
.background {
Color.yellow.ignoresSafeArea()
}
.onAppear {
blockYPos = geometry.size.height - blockHeight
}
.onReceive(timer) { _ in
blockYPos -= 5
}
}
}
private var lineView: some View {
Capsule()
.frame(height: 2)
.foregroundStyle(Color.red)
.padding(.horizontal)
}
private var close: some View {
Image(systemName: "xmark.circle.fill")
.padding(.trailing, 8)
}
private var scribble: some View {
Image(systemName: "scribble.variable")
.padding(.leading, 8)
}
private var palleteView: some View {
HStack(alignment: .center) {
Rectangle()
.fill(.green)
.frame(width: blockWidth, height: blockHeight)
Rectangle()
.fill(.blue)
.frame(width: blockWidth, height: blockHeight)
Rectangle()
.fill(.orange)
.frame(width: blockWidth, height: blockHeight)
Rectangle()
.fill(Color.indigo)
.frame(width: blockWidth, height: blockHeight)
Rectangle()
.fill(Color.mint)
.frame(width: blockWidth, height: blockHeight)
}
}
}