You need to use UIViewRepresentable for this. Here are the steps:
- Create a custom version of AnyGestureRecognizertaken from here:
class AnyGestureRecognizer: UIGestureRecognizer {
    var onCallback: () -> Void
    var offCallback: () -> Void
    init(target: Any?, onCallback: @escaping () -> Void, offCallback: @escaping () -> Void) {
        self.onCallback = onCallback
        self.offCallback = offCallback
        super.init(target: target, action: nil)
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if let touchedView = touches.first?.view, touchedView is UIControl {
            state = .cancelled
            offCallback()
        } else if let touchedView = touches.first?.view as? UITextView, touchedView.isEditable {
            state = .cancelled
            offCallback()
        } else {
            state = .began
            onCallback()
        }
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        state = .ended
        offCallback()
    }
    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
        state = .cancelled
        offCallback()
    }
}
- Create a custom UIViewRepresentableview and attach theAnyGestureRecognizerto it:
struct GestureView: UIViewRepresentable {
    var onCallback: () -> Void
    var offCallback: () -> Void
    func makeUIView(context: UIViewRepresentableContext<GestureView>) -> UIView {
        let view = UIView(frame: .zero)
        let gesture = AnyGestureRecognizer(
            target: context.coordinator,
            onCallback: onCallback,
            offCallback: offCallback
        )
        gesture.delegate = context.coordinator
        view.addGestureRecognizer(gesture)
        return view
    }
    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<GestureView>) {}
    class Coordinator: NSObject {}
    func makeCoordinator() -> GestureView.Coordinator {
        Coordinator()
    }
}
extension GestureView.Coordinator: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        true
    }
}
- Use it as an overlay:
struct ContentView: View {
    var body: some View {
        Color.blue
            .sheet(isPresented: .constant(true)) {
                Color.red
                    .overlay(
                        GestureView(onCallback: { print("start") }, offCallback: { print("end") })
                    )
            }
    }
}