![](/img/trans.png)
[英]SwiftUI - how to exclude inner `DragGesture` from outer `simultaneousGesture`?
[英]SwiftUI TabView with simultaneousGesture
我有一个TabView
,里面有一些视图,里面有DragGesture
。 我希望能够将视图与 TabView 分页一起拖动。 我正在尝试将simultaneousGesture
用于拖动手势。 这适用于ScrollView
但不适用于TabView
。 正如您在示例中看到的那样,可以拖动第二页上的绿色方块,但这不会与TabView
的水平滚动同时发生。
这是代码的简化版本:
struct ContentView: View {
let colors:[Color] = [.red, .green, .blue]
@State private var location: CGPoint = CGPoint(x: 100, y: 100);
var simpleDrag: some Gesture {
DragGesture()
.onChanged { value in
self.location = value.location
}
.onEnded {_ in }
}
var body: some View {
TabView{
ForEach(colors, id: \.self) { color in
Group {
if color == .green {
VStack {
color
.frame(width:100, height: 100)
.position(location)
.simultaneousGesture(simpleDrag)
}
} else {
color
}
}
.frame(width: 200, height: 200)
}
}
.frame(width: 400, height: 400)
.tabViewStyle(.page(indexDisplayMode: .never))
}
}
这是一个带有ScrollView
的版本,效果非常好,它甚至可以在左右移动时滚动滚动视图,并在上下拖动时移动绿色框。
struct ContentView: View {
let colors:[Color] = [.red, .green, .blue]
@State private var location: CGPoint = CGPoint(x: 100, y: 100);
var simpleDrag: some Gesture {
DragGesture()
.onChanged { value in
self.location = value.location
}
.onEnded {_ in }
}
var body: some View {
ScrollView(.horizontal) {
HStack {
ForEach(colors, id: \.self) { color in
Group {
if color == .green {
VStack {
color
.frame(width:100, height: 100)
.position(location)
.simultaneousGesture(simpleDrag)
}
} else {
color
}
}
.frame(width: 200, height: 200)
}
}
}
.frame(width: 400, height: 400)
}
}
我也一直在寻找类似的答案。 我能找到的最接近解决方案的是设置 DragGesture 的 minimumDistance 参数。 我发现 DragGesture(minimumDistance:20) 工作得相当好,允许在 DragGesture 启动之前进行 TabView 分页。它确实将另一个手势延迟 20 像素,但允许这两种手势似乎是一个公平的妥协function
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.