Page 1 of 1

Erkennen Sie die sich ändernde Position der Unteransicht dynamisch in SwiftUI

Posted: 06 Jan 2025, 21:23
by Guest
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)
}
}
}