我希望能够检测是否有任何视图落在 DragGesture 的位置下。
我尝试将 DragGesture 添加到每个视图(在本例中为圆圈),希望该操作能够跨视图传输以实现连续的 DragGesture 运动。但这没有用。
肯定有办法吗?
import SwiftUI
struct ContentView2: View {
var body: some View {
ZStack {
Image(.background)
.resizable()
.scaledToFill()
.ignoresSafeArea()
.gesture(
DragGesture(minimumDistance: 5)
.onChanged { value in
print ("DG detetected at \(value.location.x) : \(value.location.y)")
})
HStack {
Circle()
.fill(.red)
.frame(width: 100, height: 100)
.gesture(
DragGesture(minimumDistance: 0)
.onChanged { value in
print ("DG in red")
})
Circle()
.fill(.white)
.frame(width: 100, height: 100)
Circle()
.fill(.blue)
.frame(width: 100, height: 100)
}
}
}
}
#Preview {
ContentView2()
}
我已经使用 ZStack 上的 DragGesture 解决了这个问题,并将其全部嵌入到 GeometryReader 中,以将屏幕分割为手势内的不同部分。 我确信该解决方案的边缘可能有点粗糙,但这是我能得到的最接近的解决方案,我已尽力而为。 这是代码:
GeometryReader { proxy in
let size = proxy.size
ZStack {
Color.black
.ignoresSafeArea()
HStack {
Circle()
.fill(.red)
.frame(width: 100, height: 100)
Circle()
.fill(.white)
.frame(width: 100, height: 100)
Circle()
.fill(.blue)
.frame(width: 100, height: 100)
}
} //: ZSTACK
.frame(width: size.width)
.gesture(
DragGesture(minimumDistance: 0)
.onChanged({ value in
let locationX = value.location.x
let locationY = value.location.y
/// Check if we are in the middle
if locationY >= (size.height / 2) - 50 && locationY <= (size.height / 2) + 50 {
let startRedCircle = locationX <= (size.width / 3 + 10)
let startWhiteCircle = locationX >= (size.width / 3 + 10) && locationX <= (2 * size.width / 3 - 10)
let startBlueCircle = locationX >= (2 * size.width / 3 - 10) && locationX <= (3 * size.width / 3 - 30)
if (startRedCircle) {
print("Red")
} else if (startWhiteCircle) {
print("White")
} else if(startBlueCircle) {
print("Blue")
}
}
})
)
} //: GEOMETRY
当然,您可能需要根据您的具体需求进行一些调整。 结果是这样的:
如果有帮助请告诉我!