yattee/Shared/Player/TapRecognizerViewModifier.swift

70 lines
1.9 KiB
Swift
Raw Normal View History

2022-02-16 20:23:11 +00:00
import SwiftUI
struct TapRecognizerViewModifier: ViewModifier {
@State private var singleTapIsTaped: Bool = .init()
var tapSensitivity: Double
var singleTapAction: () -> Void
var doubleTapAction: () -> Void
2022-03-27 19:24:32 +00:00
var anyTapAction: () -> Void
2022-02-16 20:23:11 +00:00
2022-03-27 19:24:32 +00:00
init(
tapSensitivity: Double,
singleTapAction: @escaping () -> Void,
doubleTapAction: @escaping () -> Void,
anyTapAction: @escaping () -> Void
) {
2022-02-16 20:23:11 +00:00
self.tapSensitivity = tapSensitivity
self.singleTapAction = singleTapAction
self.doubleTapAction = doubleTapAction
2022-03-27 19:24:32 +00:00
self.anyTapAction = anyTapAction
2022-02-16 20:23:11 +00:00
}
func body(content: Content) -> some View {
content.gesture(simultaneouslyGesture)
}
private var singleTapGesture: some Gesture {
TapGesture(count: 1).onEnded {
2022-03-27 19:24:32 +00:00
anyTapAction()
2022-02-16 20:23:11 +00:00
singleTapIsTaped = true
DispatchQueue.main.asyncAfter(deadline: .now() + tapSensitivity) {
if singleTapIsTaped {
singleTapAction()
}
}
}
}
private var doubleTapGesture: some Gesture {
TapGesture(count: 2).onEnded {
singleTapIsTaped = false
doubleTapAction()
}
}
private var simultaneouslyGesture: some Gesture {
singleTapGesture.simultaneously(with: doubleTapGesture)
}
}
extension View {
2022-03-27 19:24:32 +00:00
func tapRecognizer(
tapSensitivity: Double,
singleTapAction: @escaping () -> Void,
doubleTapAction: @escaping () -> Void,
anyTapAction: @escaping () -> Void = {}
) -> some View {
modifier(
TapRecognizerViewModifier(
tapSensitivity: tapSensitivity,
singleTapAction: singleTapAction,
doubleTapAction: doubleTapAction,
anyTapAction: anyTapAction
)
)
2022-02-16 20:23:11 +00:00
}
}