From 8d61a334e2c05f143d20542a775bbe187050d428 Mon Sep 17 00:00:00 2001 From: Ido Zaltzberg Date: Wed, 10 Feb 2021 14:50:50 +0200 Subject: [PATCH 1/2] added pinch to zoom --- Sources/Gallery/Camera/CameraController.swift | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Sources/Gallery/Camera/CameraController.swift b/Sources/Gallery/Camera/CameraController.swift index a89bda95..a21a666a 100644 --- a/Sources/Gallery/Camera/CameraController.swift +++ b/Sources/Gallery/Camera/CameraController.swift @@ -65,6 +65,9 @@ class CameraController: UIViewController { cameraView.stackView.addTarget(self, action: #selector(stackViewTouched(_:)), for: .touchUpInside) cameraView.shutterButton.addTarget(self, action: #selector(shutterButtonTouched(_:)), for: .touchUpInside) cameraView.doneButton.addTarget(self, action: #selector(doneButtonTouched(_:)), for: .touchUpInside) + + let pinchRecognizer = UIPinchGestureRecognizer(target: self, action:#selector(pinch(_:))) + cameraView.addGestureRecognizer(pinchRecognizer) } func setupLocation() { @@ -161,6 +164,40 @@ class CameraController: UIViewController { return view } + + @objc func pinch(_ pinch: UIPinchGestureRecognizer) { + let minimumZoom: CGFloat = 1.0 + let maximumZoom: CGFloat = 3.0 + var lastZoomFactor: CGFloat = 1.0 + + guard let device = cameraMan.currentInput?.device else { return } + + // Return zoom value between the minimum and maximum zoom values + func minMaxZoom(_ factor: CGFloat) -> CGFloat { + return min(min(max(factor, minimumZoom), maximumZoom), device.activeFormat.videoMaxZoomFactor) + } + + func update(scale factor: CGFloat) { + do { + try device.lockForConfiguration() + defer { device.unlockForConfiguration() } + device.videoZoomFactor = factor + } catch { + print("\(error.localizedDescription)") + } + } + + let newScaleFactor = minMaxZoom(pinch.scale * lastZoomFactor) + + switch pinch.state { + case .began: fallthrough + case .changed: update(scale: newScaleFactor) + case .ended: + lastZoomFactor = minMaxZoom(newScaleFactor) + update(scale: lastZoomFactor) + default: break + } + } } extension CameraController: CartDelegate { From aa8a16b6339c5a578a5450b62db5fbeace41ceff Mon Sep 17 00:00:00 2001 From: Ido Zaltzberg Date: Wed, 10 Feb 2021 23:12:13 +0200 Subject: [PATCH 2/2] Better! Customizable. --- Sources/Gallery/Camera/CameraController.swift | 41 +++++++------------ Sources/Gallery/Utils/Config.swift | 4 ++ 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/Sources/Gallery/Camera/CameraController.swift b/Sources/Gallery/Camera/CameraController.swift index a21a666a..48825545 100644 --- a/Sources/Gallery/Camera/CameraController.swift +++ b/Sources/Gallery/Camera/CameraController.swift @@ -165,37 +165,26 @@ class CameraController: UIViewController { return view } - @objc func pinch(_ pinch: UIPinchGestureRecognizer) { - let minimumZoom: CGFloat = 1.0 - let maximumZoom: CGFloat = 3.0 - var lastZoomFactor: CGFloat = 1.0 - + @objc func pinch(_ pinch : UIPinchGestureRecognizer) { guard let device = cameraMan.currentInput?.device else { return } + let zoomFactor = device.videoZoomFactor * pinch.scale + pinch.scale = 1.0 - // Return zoom value between the minimum and maximum zoom values - func minMaxZoom(_ factor: CGFloat) -> CGFloat { - return min(min(max(factor, minimumZoom), maximumZoom), device.activeFormat.videoMaxZoomFactor) - } + let minZoomFactor = max(Config.Camera.minZoomFactor, device.minAvailableVideoZoomFactor) + let maxZoomFactor = min(Config.Camera.maxZoomFactor, device.maxAvailableVideoZoomFactor) + do { + try device.lockForConfiguration() - func update(scale factor: CGFloat) { - do { - try device.lockForConfiguration() - defer { device.unlockForConfiguration() } - device.videoZoomFactor = factor - } catch { - print("\(error.localizedDescription)") + defer { + device.unlockForConfiguration() } - } - let newScaleFactor = minMaxZoom(pinch.scale * lastZoomFactor) - - switch pinch.state { - case .began: fallthrough - case .changed: update(scale: newScaleFactor) - case .ended: - lastZoomFactor = minMaxZoom(newScaleFactor) - update(scale: lastZoomFactor) - default: break + if (zoomFactor <= maxZoomFactor && zoomFactor >= minZoomFactor) { + device.videoZoomFactor = zoomFactor + } + + } catch { + assertionFailure("Unable to set video zoom factor") } } } diff --git a/Sources/Gallery/Utils/Config.swift b/Sources/Gallery/Utils/Config.swift index 081f41e1..40b50b2c 100644 --- a/Sources/Gallery/Utils/Config.swift +++ b/Sources/Gallery/Utils/Config.swift @@ -54,6 +54,10 @@ public struct Config { } public static var imageLimit: Int = 0 + + public static var minZoomFactor: CGFloat = 1 + + public static var maxZoomFactor: CGFloat = 10 }