Adding a drag gesture in SwiftUI to a View inside a ScrollView blocks the scrolling

后端 未结 7 565
忘掉有多难
忘掉有多难 2020-12-23 12:49

So I have a ScrollView holding a set of views:

    ScrollView {
        ForEach(cities) { city in
            NavigationLink(destination: ...) {         


        
7条回答
  •  难免孤独
    2020-12-23 13:32

    I had a similar problem with dragging a slider at:

    stackoverflow question

    This is the working answer code, with the "trick" of the "DispatchQueue.main.asyncAfter"

    Maybe you could try something similar for your ScrollView.

    struct ContentView: View {
    @State var pos = CGSize.zero
    @State var prev = CGSize.zero
    @State var value = 0.0
    @State var flag = true
    
    var body: some View {
        let drag = DragGesture()
            .onChanged { value in
                self.pos = CGSize(width: value.translation.width + self.prev.width, height: value.translation.height + self.prev.height)
        }
        .onEnded { value in
            self.pos = CGSize(width: value.translation.width + self.prev.width, height: value.translation.height + self.prev.height)
            self.prev = self.pos
        }
        return VStack {
            Slider(value: $value, in: 0...100, step: 1) { _ in
                self.flag = false
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                    self.flag = true
                }
            }
        }
        .frame(width: 250, height: 40, alignment: .center)
        .overlay(RoundedRectangle(cornerRadius: 25).stroke(lineWidth: 2).foregroundColor(Color.black))
        .offset(x: self.pos.width, y: self.pos.height)
        .gesture(flag ? drag : nil)
    }
    

    }

提交回复
热议问题