我的应用程序有一个完成按钮,我想让它,当用户按下按钮,他们必须举行他们的手指按下2秒之前的行动是初始化(即弹出窗口出现)。当他们举行,按钮填补了从左到右类似于加载栏。这是我目前的代码,但由于某种原因,它不工作
@GestureState private var isLongPressing = false
Button("Complete") {
withAnimation {
viewModel.isPopupPresented.toggle()
viewModel.stopProgressTimer()
}
}
.font(.system(size: 20, weight: .heavy, design: .rounded))
.foregroundColor(.white)
.frame(width: 150, height: 40, alignment: .center)
.background(
ZStack {
RoundedRectangle(cornerRadius: 20, style: .continuous)
.fill(Color.secondaryColor)
if isLongPressing {
RoundedRectangle(cornerRadius: 20, style: .continuous)
.fill(Color.red)
.frame(width: 150 * CGFloat(viewModel.progress), height: 40, alignment: .leading)
}
}
)
.gesture(
LongPressGesture(minimumDuration: 2.0)
.updating($isLongPressing) { value, state, _ in
state = value
if value {
viewModel.startProgressTimer()
} else {
viewModel.stopProgressTimer()
}
}
.onEnded { value in
if isLongPressing {
// Trigger your action here
viewModel.isPopupPresented.toggle()
viewModel.stopProgressTimer()
}
}
)
字符串
在我的ViewModel中,我有以下内容:
@Published var progress: Double = 0.0
private var progressTimer: Timer?
func resetProgress() {
progressTimer?.invalidate()
progress = 0.0
}
func startProgressTimer() {
progressTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
if self.progress < 1.0 {
self.progress += 0.1
} else {
self.progress = 1.0
self.resetProgress()
}
}
}
func stopProgressTimer() {
progressTimer?.invalidate()
progress = 0.0
}
型
1条答案
按热度按时间3pvhb19x1#
我首先检测触摸事件(使用
DragGesture(minimumDistance: 0)
)。在触摸时,我们启动一个2秒的动画进度。同时,检测一个持续时间为2的长按手势。如果在拖动手势结束之前没有检测到长按,这意味着按下时间小于2秒,因此我们取消动画。否则,如果检测到长按,则显示弹出窗口。
字符串
touchDown
在background
中用于制作动画。完整代码:
型