0

Pretty simple problem that is making out to be harder to solve than it should: My gesture is simple not calling, at all. I am using a uiviewrepresentable that is displayed inside of a zstack. If i add a .tapgesture{} to CameraView() directly it works just fine. But i need to get the tap position

public struct CameraView: UIViewRepresentable {
    @EnvironmentObject var ue: UserEvents
    public func makeUIView(context: Context) -> UIView {
        let view = UIView(frame: UIScreen.main.bounds)
        let focusGesture = UITapGestureRecognizer(target: self, action: #selector(context.coordinator.tapFocus(_:)))
        self.ue.cameraPreview = AVCaptureVideoPreviewLayer(session: ue.session)
        self.ue.cameraPreview.frame = view.frame
        self.ue.cameraPreview.videoGravity = ue.videoGravity
        self.ue.session.startRunning()
        view.isUserInteractionEnabled = true
        view.layer.addSublayer(self.ue.cameraPreview)
        focusGesture.numberOfTapsRequired = 1
        view.addGestureRecognizer(focusGesture)
        return view
    }
    
    public func updateUIView(_ uiView: UIViewType, context: Context) { }
    
    public func makeCoordinator() -> Self.Coordinator {
        return Coordinator()
    }
    
    public class Coordinator: NSObject {
        @objc public func tapFocus(_ sender: UITapGestureRecognizer) {
            print("tap")
        }
    }
}
jnpdx
  • 45,847
  • 6
  • 64
  • 94
Trevor
  • 580
  • 5
  • 16

1 Answers1

2

The target should be the coordinator (which is a persistent entity, unlike the transient View), not self.

let focusGesture = UITapGestureRecognizer(target: context.coordinator, action: #selector(context.coordinator.tapFocus(_:)))
jnpdx
  • 45,847
  • 6
  • 64
  • 94