繁体   English   中英

SwiftUI TabView with 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM