#ios #swift #swiftui
#iOS #swift #swiftui
Вопрос:
Я хочу запустить действие один раз при использовании TapGesture и несколько раз при использовании longPressGesture. Лучший пример того, что я хочу сделать, — это клавиша «Удалить» на клавиатуре, когда вы долго нажимаете ее, она продолжает удалять последний символ.
Мой вопрос в том, как воспроизвести это поведение в SwiftUI.
На данный момент я придумал это решение (которое не работает):
struct ContentView: View {
var longPress: some Gesture {
LongPressGesture(minimumDuration: 3)
.onChanged({ (bool) in
guard bool else {
self.timer?.invalidate()
return
}
self.timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { (timer) in
action() // Fired every 0.2 seconds until the user stop pressing
}
})
}
@State var timer: Timer? = nil
var body: some View {
Subview()
.onTapGesture {
action() // Fired once
}
.gesture(longPress)
}
}
Ответ №1:
Вы можете попробовать следующее:
struct ContentView: View {
@State var timer: Timer?
var body: some View {
Text("Tap me")
.onTapGesture {
self.action()
}
.gesture(
LongPressGesture()
.onEnded { _ in // fired when `LongPressGesture` is detected
print("start...")
self.timer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { _ in
self.action()
}
}
.sequenced(before:
DragGesture(minimumDistance: 0)
.onEnded { _ in
print("end...")
self.timer?.invalidate()
self.timer = nil
}
)
)
}
func action() {
print("action...")
}
}