是否可以检测当前哪个View属于DragGesture的位置?

问题描述 投票:0回答:1

我希望能够检测是否有任何视图落在 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()
}
swiftui
1个回答
0
投票

我已经使用 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

当然,您可能需要根据您的具体需求进行一些调整。 结果是这样的:

如果有帮助请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.