swiftPunk
swiftPunk

Reputation: 1

How can I have 2 Gestures in SwiftUI?

I have a CircleView() which is movable! I want minimumDistance for DragGesture be Zero for this View and in the other hand I defined another Gesture called onTapGesture, it is working but not in the way I wanted! because of onTapGesture the minimumDistance became 10 and with dragging you can see that SwiftUI think minimumDistance is 10, how can I have both Gestures working fine with minimumDistance = 0 ?

my goal: I want have an onTapGesture and a DragGesture with minimumDistance = 0

    import SwiftUI

struct ContentView: View {
    var body: some View {
        
        CircleView()
        
    }
}

struct CircleView: View {

    @State private var location: CGSize = CGSize()
    @GestureState private var translation: CGSize = CGSize()
    
    var body: some View {
        Circle()
            .fill()
            .frame(width: 100, height: 100, alignment: .center)
            .position(x: location.width + translation.width + 100, y: location.height + translation.height + 100)
   
            .onTapGesture { print("onTapGesture!") }                  // << Until here: minimumDistance: 10
            
            .gesture(DragGesture(minimumDistance: 0)                  // << After here: minimumDistance: 0 But also it does not Help! SwiftUI thinks that minimumDistance is 10!
                        .updating($translation) { value, state, _ in
                            state = value.translation
                        }
                        .onEnded { value in
                            location = CGSize(width: location.width + value.translation.width, height: location.height + value.translation.height)
                        })
        
    }
}

Upvotes: 1

Views: 280

Answers (1)

CALL-151
CALL-151

Reputation: 564

One option is to compose a combination of two simultaneous gestures, like this:

   import SwiftUI

struct ContentView: View {
  var body: some View {
    
    CircleView()
    
  }
}

struct CircleView: View {
  
  @State private var location: CGSize = CGSize()
  @GestureState private var translation: CGSize = CGSize()
  
  var body: some View {
    
    let tapDrag = DragGesture(minimumDistance: 0)
      .updating($translation) { value, state, _ in
        state = value.translation
      }
      .onEnded { value in
        location = CGSize(width: location.width + value.translation.width, height: location.height + value.translation.height)
      }
      .simultaneously(with: TapGesture()
                        .onEnded{ print("onTapGesture!") }  )
    
    Circle()
      .fill()
      .frame(width: 100, height: 100, alignment: .center)
      .position(x: location.width + translation.width + 100, y: location.height + translation.height + 100)
      .gesture(tapDrag)
  }
}

Upvotes: 1

Related Questions