Swift 用手势表示;触摸输入“;迅捷

Swift 用手势表示;触摸输入“;迅捷,swift,swiftui,Swift,Swiftui,我正在使用VStack显示一系列循环视图。当用户点击其中一个视图时,它将高亮显示。为了使突出显示在触屏时显示,而不是在触屏释放时显示,我使用了DragGesture,其minimumDistance值为0: private func highlight手势(i:Int)->一些手势{ 牵引力(最小距离:0.0) .onChanged{inhighlight=i} .onEnded{uUin highlight=nil} } 但是,我希望当用户的拖动手势进入另一个视图时,高亮显示会更新。例如,如

我正在使用
VStack
显示一系列循环视图。当用户点击其中一个视图时,它将高亮显示。为了使突出显示在触屏时显示,而不是在触屏释放时显示,我使用了
DragGesture
,其
minimumDistance
值为
0

private func highlight手势(i:Int)->一些手势{
牵引力(最小距离:0.0)
.onChanged{inhighlight=i}
.onEnded{uUin highlight=nil}
}
但是,我希望当用户的拖动手势进入另一个视图时,高亮显示会更新。例如,如果我轻按并高亮显示第一个视图,然后将手指移到第二个视图上,而不将其从屏幕上取下,则应高亮显示第二个视图

使用上面显示的手势,视图仅在点击时高亮显示。相反,我希望视图在点击或触摸进入视图时高亮显示


非常感谢您的帮助。

下面是一个简单的示例,展示了一种可能的方法来拖动手指 2个视图/图像,并在进入不同视图/图像时高亮显示。 你必须用这个做更多的工作。希望能有帮助

struct ContentView: View {

class ImgObj: ObservableObject {
    @Published var img1Rec: CGRect = CGRect.zero
    @Published var img2Rec: CGRect = CGRect.zero
    @Published var img1Color: Color = .black
    @Published var img2Color: Color = .black
}

@ObservedObject var imgObj = ImgObj()
@GestureState var dragVar = CGSize.zero

var body: some View {
    
    let dragger = DragGesture(minimumDistance: 0.0, coordinateSpace: .global)
        .updating($dragVar, body: { (value, _, _) in
            imgObj.img1Color = imgObj.img1Rec.contains(value.location) ? .red : .black
            imgObj.img2Color = imgObj.img2Rec.contains(value.location) ? .red : .black
        })
    
    GeometryReader { geometry in
        VStack {
            Image(systemName: "clock").resizable().frame(width: 222, height: 222)
                .foregroundColor(imgObj.img1Color)
                .gesture(dragger)
                .onAppear {
                    // use geometry.frame(in: .global) somehow to get the CGRect
                    imgObj.img1Rec = CGRect(x: 0, y: 0, width: 222, height: 222)
                }
            Image(systemName: "folder").resizable().frame(width: 222, height: 222)
                .foregroundColor(imgObj.img2Color)
                .gesture(dragger)
                .onAppear {
                    // use geometry.frame(in: .global) somehow to get the CGRect
                    imgObj.img2Rec = CGRect(x: 0, y: 222, width: 222, height: 222)
                }
        }
    }
}
}
编辑注:

而不是:

            .onAppear {
                // use geometry.frame(in: .global) somehow to get the CGRect
                imgObj.img1Rec = CGRect(x: 0, y: 222, width: 222, height: 222)
            }
            
您可以使用:

                 .background(
                    GeometryReader { proxy in
                        Color.clear
                            .onAppear {
                                imgObj.img1Rec = proxy.frame(in: .global)
                            }
                    })
                    

非常感谢。我试试看。