【发布时间】:2020-10-25 06:05:36
【问题描述】:
我正在努力在 ScrollView 中同时实现 TapGesture 和 LongPressGesture。 .onTapGesture 和 .onLongPressGesture 一切正常,但我希望当用户点击按钮时,按钮的不透明度会降低,就像普通的 Button() 一样。
但是,无论出于何种原因,Button() 都无法选择在长按时执行某项操作。所以我尝试使用.gesture(LongPressGesture() ... )。这种方法有效并显示了点击指示。不幸的是,这不适用于ScrollView:你不能再滚动它了!
所以我做了一些研究,发现在LongPressGesture 之前必须有一个 TapGesture,这样ScrollView 才能正常工作。确实是这样,但是我的LongPressGesture 不再起作用了。
希望有人有解决方案...
struct ContentView: View {
var body: some View {
ScrollView(.horizontal){
HStack{
ForEach(0..<5){ _ in
Button()
}
}
}
}
}
struct Button: View{
@GestureState var isDetectingLongPress = false
@State var completedLongPress = false
var body: some View{
Circle()
.foregroundColor(.red)
.frame(width: 100, height: 100)
.opacity(self.isDetectingLongPress ? 0 : 1)
// That works, but there is no indication for the user that the UI recognized the gesture
// .onTapGesture {
// print("Tapped!")
// }
// .onLongPressGesture(minimumDuration: 0.5){
// print("Long pressed!")
// }
// The approach (*) shows the press indication, but the ScrollView is stuck because there is no TapGesture
// If I add a dummy TapGesture, the LongPressGesture won't work anymore but now the ScrollView works as expected
//.onTapGesture {}
// (*)
.gesture(LongPressGesture()
.updating(self.$isDetectingLongPress) { currentstate, gestureState,
transaction in
gestureState = currentstate
}
.onEnded { finished in
self.completedLongPress = finished
}
)
}
}
【问题讨论】: