【发布时间】:2022-01-03 07:30:59
【问题描述】:
在 SwiftUI 上使用长按手势只需保持长按手势 1 秒钟,然后自动释放长按。我希望用户最多按下 1 分钟或更长时间。这可能吗?如何做到。
在下面查看我的代码,该代码目前仅支持 1 秒持续时间的长按手势。
struct IgnitionDriveView: View {
@GestureState private var drivingGestureState = false
@GestureState private var reverseGestureState = false
@State private var showDriveAlert = true
@State private var showOutOfGasAlert = false
@State var distanceCovered: Float = 1.0
var body: some View {
let circleShape = Circle()
let driveGesture = LongPressGesture(minimumDuration: 1)
.updating($drivingGestureState) { (currentState, gestureState, transaction) in
gestureState = currentState
}.onChanged { _ in
if distanceCovered < 1000 {
self.distanceCovered += 10
} else {
showOutOfGasAlert = true
}
}
let reverseGesture = LongPressGesture(minimumDuration: 1)
.updating($reverseGestureState) { (currentState, gestureState, transaction) in
gestureState = currentState
}.onChanged { _ in
if distanceCovered > 0 {
self.distanceCovered -= 10
}
}
VStack(alignment: .leading) {
Text("Distance Covered in Km: \(distanceCovered)")
.font(.headline)
ProgressView(value: distanceCovered > 0 ? distanceCovered : 0, total: 1000)
.frame(height: 40)
HStack {
ZStack {
circleShape.strokeBorder(style: StrokeStyle(lineWidth: 2))
circleShape
.fill(drivingGestureState ? .white : .red)
.frame(width: 100, height: 100, alignment: .center)
Text("D")
.bold()
.padding()
.foregroundColor(.green)
.font(.title)
}.foregroundColor(.green)
.gesture(driveGesture)
Spacer()
ZStack {
circleShape.strokeBorder(style: StrokeStyle(lineWidth: 2))
circleShape
.fill(reverseGestureState ? .white : .red)
.frame(width: 100, height: 100, alignment: .center)
Text("R")
.bold()
.padding()
.foregroundColor(.red)
.font(.title)
}.foregroundColor(.green)
.gesture(reverseGesture)
}.padding()
}.alert("Press D to Drive and R to Reverse", isPresented: $showDriveAlert) {
Button("Okay") { showDriveAlert = false }
}.alert("You ran out of Gas, Reverse to Gas Station", isPresented: $showOutOfGasAlert) {
Button("Sucks, but fine!") { showOutOfGasAlert = false }
}
.padding()
}
}
【问题讨论】:
-
1分60秒。
-
增加最小值会延长长按,但在用户按下视图时更新不会传递到updated()。
-
这是否回答了您的问题stackoverflow.com/a/61524230/12299030?
-
您能否准确解释您想要实现的目标,而不是说“我希望用户按下最多 1 分钟或更长时间。”。你到底想“更新”什么,什么时候结束?
-
我希望计数器 [distanceCovered] 只要用户按下视图并更新进度视图值直到计数器达到 1000,就可以更新 [增加/减少]。希望这很清楚.