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

时间:2019-11-23 13:59:33

标签: 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
            }
        )
    }
}

我希望整个视图根据offset var(由拖动手势更改)上下移动。但是,即使我在.gesture上写了VStack修饰符,并且即使VStack是全屏显示(由于.frame修饰符),拖动手势也不会起作用VStack。仅当我拖动“ Hello world”文本时,该手势才有效,但是如果我拖动到Text之外(但仍在全屏VStack内),则该手势无响应。有任何想法吗?谢谢。

2 个答案:

答案 0 :(得分:9)

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

只需将.contentShape(Rectangle())放在手势修饰符之前,它将响应整个封闭的矩形。 :)

答案 1 :(得分:3)

您的容器是透明的。透明的东西不处理事件。因此,添加一些背景,例如下面的演示和所有作品。

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