MijickCamera/Sources/Internal/UI/Camera View/CameraView+Bridge.swift

69 lines
2.3 KiB
Swift
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// CameraView+Bridge.swift of MijickCamera
//
// Created by Tomasz Kurylik. Sending from Kraków!
// - Mail: tomasz.kurylik@mijick.com
// - GitHub: https://github.com/FulcrumOne
// - Medium: https://medium.com/@mijick
//
// Copyright ©2024 Mijick. All rights reserved.
import SwiftUI
struct CameraBridgeView: UIViewRepresentable {
let cameraManager: CameraManager
let inputView: UIView = .init()
}
extension CameraBridgeView {
func makeUIView(context: Context) -> some UIView {
cameraManager.initialize(in: inputView)
setupTapGesture(context)
setupPinchGesture(context)
return inputView
}
func updateUIView(_ uiView: UIViewType, context: Context) {}
func makeCoordinator() -> Coordinator { .init(self) }
}
private extension CameraBridgeView {
func setupTapGesture(_ context: Context) {
let tapRecognizer = UITapGestureRecognizer(target: context.coordinator, action: #selector(context.coordinator.onTapGesture))
inputView.addGestureRecognizer(tapRecognizer)
}
func setupPinchGesture(_ context: Context) {
let pinchRecognizer = UIPinchGestureRecognizer(target: context.coordinator, action: #selector(context.coordinator.onPinchGesture))
inputView.addGestureRecognizer(pinchRecognizer)
}
}
// MARK: Equatable
extension CameraBridgeView: Equatable {
nonisolated static func ==(lhs: Self, rhs: Self) -> Bool { true }
}
// MARK: - GESTURES
extension CameraBridgeView { class Coordinator: NSObject { init(_ parent: CameraBridgeView) { self.parent = parent }
let parent: CameraBridgeView
}}
// MARK: On Tap
extension CameraBridgeView.Coordinator {
@MainActor @objc func onTapGesture(_ tap: UITapGestureRecognizer) {
do {
let touchPoint = tap.location(in: parent.inputView)
try parent.cameraManager.setCameraFocus(at: touchPoint)
} catch {}
}
}
// MARK: On Pinch
extension CameraBridgeView.Coordinator {
@MainActor @objc func onPinchGesture(_ pinch: UIPinchGestureRecognizer) { if pinch.state == .changed {
do {
let desiredZoomFactor = parent.cameraManager.attributes.zoomFactor + atan2(pinch.velocity, 33)
try parent.cameraManager.setCameraZoomFactor(desiredZoomFactor)
} catch {}
}}
}