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

Programmierung für iOS
Guest
 Erkennen Sie die sich ändernde Position der Unteransicht dynamisch in SwiftUI

Post 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)
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post