我不明白为什么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
变量(由拖动手势更改(上下移动。但是即使我在VStack
上写了.gesture
修饰符,即使VStack
是全屏的(多亏了.frame
修饰符(,拖动手势也不适用于VStack
。仅当我拖动"Hello world"文本时,该手势才有效,但如果我拖到Text
外(但仍在全屏VStack
内(,则无响应。有什么想法吗?谢谢。
实际上,有一个 SwiftUI 功能旨在解决这个问题,而无需背景。
只需将.contentShape(Rectangle())
放在手势修改器之前,它就会响应整个封闭矩形。 :)
您的容器是透明的。透明的东西不处理事件。因此,添加一些背景,如下面的演示和所有作品。
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
}
)
}