SwiftUI DragGesture 阻止列表垂直​​滚动?

时间:2021-03-09 11:46:56

标签: swiftui

我正在尝试在列表单元格内添加滑动,滑动以显示更多选项,例如删除、存档等。

滑动工作正常,但列表(垂直滚动)不再向上滚动。

细胞咬合:

import SwiftUI

struct cl_task: View {
    @State private var offset: CGSize = .zero
  
    var body: some View {
        
        //Swipe to custom options ,by "Jack" this option not yet available in SwiftUI
        let drag = DragGesture(minimumDistance: 0, coordinateSpace: .local)
       
                   .onChanged {
                    
                    if (self.offset.width > 0 ){  return }
                    self.offset.width = $0.translation.width
                
                   }.onEnded {
                   if $0.translation.width < -100 {
                       self.offset = .init(width: -100, height: 0)
                   } else {
                      self.offset = .zero
                   }
               }
        ZStack{
            Rectangle().foregroundColor(.blue).offset(x: offset.width, y: offset.height)
                .gesture(drag)
                .animation(.easeIn, value: offset)
            Text("test").foregroundColor(.white)
        }.frame(minWidth: 0,
                maxWidth: .infinity,
                minHeight: 100,
                maxHeight: .infinity,
                alignment: .topLeading
        )
        
    }
}

struct cl_task_Previews: PreviewProvider {
    static var previews: some View {
        cl_task().previewLayout(.sizeThatFits)
    }
}

列表主视图:

struct Item {
    let uuid = UUID()
    let value: String
}

struct w_tasks: View {
    
    @State private var items = [Item]()
      

      var body: some View {
          ZStack {
            
    
                        List(self.items, id: \.uuid) {item in
                      
                            cl_task() 
                            
                        
                        }
                        .simultaneousGesture(DragGesture().onChanged({ value in

                           //Scrolled
                        }))
                
      

              
              VStack {
                  Spacer()

                  HStack {
                      Spacer()

                      Button(action: {
                          self.items.append(Item(value: "Item"))
                      }, label: {
                          Text("+")
                          .font(.system(size: 50))
                          .frame(width: 77, height: 70)
                          .foregroundColor(Color.white)
                          .padding(.bottom, 7)
                      })
                      .background(Color(hex : "#216D94"))
                      .cornerRadius(38.5)
                      .padding()
                      .shadow(color: Color.black.opacity(0.3),
                              radius: 3,
                              x: 3,
                              y: 3)
                  }
              }
          }
      }
}

struct w_tasks_Previews: PreviewProvider {

    static var previews: some View {
        w_tasks()
    }
}

我花了几个小时解决这个问题后发布了我的问题,因为我是 SwiftUI 的新手,有什么解决方法的建议吗?

1 个答案:

答案 0 :(得分:1)

解决办法是给swipe不同的距离,如下图

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

    var body: some View {

        // give 25 distance makes vertical scroll enabled !!
        let drag = DragGesture(minimumDistance: 25, coordinateSpace: .local)

                   .onChanged {

使用 Xcode 12.4 / iOS 14.4 测试

demo

相关问题