So I have a ScrollView
holding a set of views:
ScrollView {
ForEach(cities) { city in
NavigationLink(destination: ...) {
CityRow(city: city)
}
.buttonStyle(BackgroundButtonStyle())
}
}
In every view I have a drag gesture:
let drag = DragGesture()
.updating($gestureState) { value, gestureState, _ in
// ...
}
.onEnded { value in
// ...
}
Which I assign to a part of the view:
ZStack(alignment: .leading) {
HStack {
// ...
}
HStack {
// ...
}
.gesture(drag)
}
As soon as I attach the gesture, the ScrollView
stop scrolling. The only way to make it scroll it to start scrolling from a part of it which has no gesture attached. How can I avoid it and make both work together. In UIKit is was as simple as specifying true
in shouldRecognizeSimultaneouslyWith
method. How can I have the same in SwiftUI?
In SwiftUI I've tried attaching a gesture using .simultaneousGesture(drag)
and .highPriorityGesture(drag)
– they all work the same as .gesture(drag)
. I've also tried providing all possible static GestureMask
values for including:
parameter – I have either scroll working or my drag gesture working. Never both of them.
Just before
You can add
This works for me, apparently adding a tapGesture avoids confusion between the two DragGestures.
I hope this helps
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.
}
I believe what you want is
simultaneousGesture(_:including:)
, which is documented here.You can set minimumDistance to some value (for instance 30). Then the drag only works when you drag horizontally and reach the minimum distance, otherwise the scrollview or list gesture override the view gesture
I attempted to implement a similar list style in my app only to find that the gestures conflicted with the ScrollView. After having spent hours researching and attempting possible fixes and workarounds for this issue, as of XCode
11.3.1
, I believe this to be a bug that Apple needs to resolve in future versions of SwiftUI.A Github repo with sample code to replicate the issue has been put together here and has been reported to Apple with the reference
FB7518403
.Here's hoping it is fixed soon!
I have created an easy to use extension based on the Michel's answer.
You apply it after using a drag gesture.
Example: