SwiftUI:VStack/HStack/ZStack 拖动手势不起作用

sup*_*cio 8 ios swift swiftui

我不明白为什么DragGesture在 VStack/HStack/ZStack 上不起作用。考虑以下简单示例:

struct ContentView: View {
    @State private var offset = CGSize.zero

    var body: some View {
        VStack {
            Text("Hello World!")
        }
        .frame(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
        .edgesIgnoringSafeArea(.all)
        .offset(y: offset.height)
        .gesture(DragGesture()
            .onChanged { val in
                self.offset = val.translation
            }
            .onEnded { val in
                self.offset = .zero
            }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望整个视图根据offsetvar上下移动(由拖动手势改变)。但是,即使我写.gesture上的修饰VStack,甚至如果VStack是全屏幕(得益于.frame修改)拖动动作将不会在工作VStack。该手势仅在我拖动“Hello world”文本时有效,但如果我拖动到外部Text(但仍在全屏内部VStack)则无响应。有任何想法吗?谢谢。

Ant*_*ton 16

实际上,有一个 SwiftUI 功能旨在解决这个问题,而无需背景。

只需放置.contentShape(Rectangle())在您的手势修改器之前,它就会响应整个封闭矩形。:)

  • 请注意,正确的顺序很重要:“.frame”需要在“.contentShape”之前调用,否则不起作用。 (2认同)

Asp*_*eri 6

你的容器是透明的。透明的东西不处理事件。所以,添加一些背景,就像下面的演示一样,一切正常。

var body: some View {
    VStack {
        Text("Hello World!")
    }
    .frame(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
    .edgesIgnoringSafeArea(.all)
    .background(Color.white)
    .offset(y: offset.height)
    .gesture(DragGesture()
        .onChanged { val in
            self.offset = val.translation
        }
        .onEnded { val in
            self.offset = .zero
        }
    )
}
Run Code Online (Sandbox Code Playgroud)