From 88c0496a7e0a8ab107d20325b19da62734b9a683 Mon Sep 17 00:00:00 2001 From: jpldev Date: Fri, 16 Feb 2024 07:38:30 +0100 Subject: [PATCH 1/5] Upgrade: min version iOS 13+ --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index d93a6bb7..cf173358 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let package = Package( name: "ImagePicker", platforms: [ - .iOS(.v9) + .iOS(.v13) ], products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. From 84acbf9d5b88ca3426983509179aa9ad3a9166f7 Mon Sep 17 00:00:00 2001 From: jpldev Date: Fri, 16 Feb 2024 07:40:35 +0100 Subject: [PATCH 2/5] Add: Support for tripleCamera if available. --- Source/CameraView/CameraMan.swift | 39 ++++++++++++++++++++---------- Source/CameraView/CameraView.swift | 7 +----- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Source/CameraView/CameraMan.swift b/Source/CameraView/CameraMan.swift index 8714823f..3eb9e3cb 100644 --- a/Source/CameraView/CameraMan.swift +++ b/Source/CameraView/CameraMan.swift @@ -33,20 +33,29 @@ class CameraMan { func setupDevices() { // Input AVCaptureDevice - .devices() - .filter { - return $0.hasMediaType(AVMediaType.video) - }.forEach { + .DiscoverySession(deviceTypes: [.builtInTripleCamera,.builtInTelephotoCamera], mediaType: AVMediaType.video, position: .front) + .devices + .forEach { switch $0.position { case .front: self.frontCamera = try? AVCaptureDeviceInput(device: $0) - case .back: - self.backCamera = try? AVCaptureDeviceInput(device: $0) + default: break } } + AVCaptureDevice + .DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back) + .devices + .forEach { + let backCamera = try? AVCaptureDeviceInput(device: $0) + if self.backCamera == nil + { + self.backCamera = backCamera + } + } + // Output stillImageOutput = AVCaptureStillImageOutput() stillImageOutput?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] @@ -203,15 +212,19 @@ class CameraMan { } } - func zoom(_ zoomFactor: CGFloat) { - guard let device = currentInput?.device, device.position == .back else { return } + func zoom(_ zoomFactor: CGFloat) { + guard var device = currentInput?.device, device.position == .back else { return } - queue.async { - self.lock { - device.videoZoomFactor = zoomFactor - } + queue.async { + do + { + var newZoomFactor = zoomFactor < 1.0 ? 1.0 : zoomFactor + self.lock { + device.ramp(toVideoZoomFactor: newZoomFactor, withRate: 4.0) + } + } + } } - } // MARK: - Lock diff --git a/Source/CameraView/CameraView.swift b/Source/CameraView/CameraView.swift index c190224f..3a752358 100644 --- a/Source/CameraView/CameraView.swift +++ b/Source/CameraView/CameraView.swift @@ -96,9 +96,6 @@ class CameraView: UIViewController, CLLocationManagerDelegate, CameraManDelegate var locationManager: LocationManager? var startOnFrontCamera: Bool = false - private let minimumZoomFactor: CGFloat = 1.0 - private let maximumZoomFactor: CGFloat = 3.0 - private var currentZoomFactor: CGFloat = 1.0 private var previousZoomFactor: CGFloat = 1.0 @@ -264,11 +261,9 @@ class CameraView: UIViewController, CLLocationManagerDelegate, CameraManDelegate func zoomTo(_ zoomFactor: CGFloat) { guard let device = cameraMan.currentInput?.device else { return } - let maximumDeviceZoomFactor = device.activeFormat.videoMaxZoomFactor let newZoomFactor = previousZoomFactor * zoomFactor - currentZoomFactor = min(maximumZoomFactor, max(minimumZoomFactor, min(newZoomFactor, maximumDeviceZoomFactor))) - cameraMan.zoom(currentZoomFactor) + cameraMan.zoom(newZoomFactor) } // MARK: - Tap From 266abe188e1c16e2d411b0a0947a71695d48896d Mon Sep 17 00:00:00 2001 From: Ahmed El Moden Date: Fri, 16 Feb 2024 15:15:48 +0100 Subject: [PATCH 3/5] Use triple, dual, then single camera by priority. Target iOS 13+ --- Demo/ImagePickerDemo/Podfile | 2 +- ImagePicker.podspec | 2 +- Source/CameraView/CameraMan.swift | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Demo/ImagePickerDemo/Podfile b/Demo/ImagePickerDemo/Podfile index 0f256f62..78ba7dfe 100644 --- a/Demo/ImagePickerDemo/Podfile +++ b/Demo/ImagePickerDemo/Podfile @@ -1,4 +1,4 @@ -platform :ios, '9.2' +platform :ios, '13.0' use_frameworks! inhibit_all_warnings! diff --git a/ImagePicker.podspec b/ImagePicker.podspec index 92dd7642..2639bc3c 100644 --- a/ImagePicker.podspec +++ b/ImagePicker.podspec @@ -7,7 +7,7 @@ Pod::Spec.new do |s| s.author = { "Hyper Interaktiv AS" => "ios@hyper.no" } s.source = { :git => "https://github.com/hyperoslo/ImagePicker.git", :tag => s.version.to_s } s.social_media_url = 'https://twitter.com/hyperoslo' - s.platform = :ios, '9.0' + s.platform = :ios, '13.0' s.requires_arc = true s.source_files = 'Source/**/*' s.resource_bundles = { 'ImagePicker' => ['Images/*.{png}'] } diff --git a/Source/CameraView/CameraMan.swift b/Source/CameraView/CameraMan.swift index 3eb9e3cb..ee75a425 100644 --- a/Source/CameraView/CameraMan.swift +++ b/Source/CameraView/CameraMan.swift @@ -46,7 +46,7 @@ class CameraMan { } AVCaptureDevice - .DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back) + .DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back) .devices .forEach { let backCamera = try? AVCaptureDeviceInput(device: $0) @@ -255,9 +255,9 @@ class CameraMan { func preferredPresets() -> [String] { return [ - AVCaptureSession.Preset.high.rawValue, - AVCaptureSession.Preset.high.rawValue, - AVCaptureSession.Preset.low.rawValue + AVCaptureSession.Preset.high.rawValue, + AVCaptureSession.Preset.medium.rawValue, + AVCaptureSession.Preset.low.rawValue, ] } } From dc8b5ad4c87a5940b9ff5634c2721a29648a1152 Mon Sep 17 00:00:00 2001 From: Ahmed El Moden Date: Wed, 21 Feb 2024 17:12:51 +0100 Subject: [PATCH 4/5] Bugfix: Camera too zoomed in. --- Source/CameraView/CameraMan.swift | 57 +++++++++++++++--------------- Source/CameraView/CameraView.swift | 2 +- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Source/CameraView/CameraMan.swift b/Source/CameraView/CameraMan.swift index ee75a425..03085d41 100644 --- a/Source/CameraView/CameraMan.swift +++ b/Source/CameraView/CameraMan.swift @@ -45,15 +45,28 @@ class CameraMan { } } - AVCaptureDevice - .DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back) - .devices - .forEach { - let backCamera = try? AVCaptureDeviceInput(device: $0) - if self.backCamera == nil - { - self.backCamera = backCamera - } + let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInUltraWideCamera, .builtInDualCamera, .builtInWideAngleCamera], mediaType: .video, position: .back) + var selectedDevice: AVCaptureDevice? + + // Attempt to find a triple camera first + if let tripleCameraDevice = discoverySession.devices.first(where: { $0.deviceType == .builtInUltraWideCamera }) { + selectedDevice = tripleCameraDevice + } else if let dualCameraDevice = discoverySession.devices.first(where: { $0.deviceType == .builtInDualCamera }) { + // Fallback to dual camera if no triple camera is found + selectedDevice = dualCameraDevice + } else if let wideAngleCameraDevice = discoverySession.devices.first(where: { $0.deviceType == .builtInWideAngleCamera }) { + // Fallback to wide angle camera if no dual camera is found + selectedDevice = wideAngleCameraDevice + } + + // If a device was selected, create the AVCaptureDeviceInput + if let selectedDevice = selectedDevice { + do { + let backCameraInput = try AVCaptureDeviceInput(device: selectedDevice) + self.backCamera = backCameraInput + } catch { + print("Error creating AVCaptureDeviceInput for the selected device: \(error)") + } } // Output @@ -62,7 +75,6 @@ class CameraMan { } func addInput(_ input: AVCaptureDeviceInput) { - configurePreset(input) if session.canAddInput(input) { session.addInput(input) @@ -107,6 +119,10 @@ class CameraMan { } fileprivate func start() { + self.session.beginConfiguration() + + session.sessionPreset = .photo + // Devices setupDevices() @@ -118,6 +134,8 @@ class CameraMan { session.addOutput(output) } + self.session.commitConfiguration() + queue.async { self.session.startRunning() @@ -241,23 +259,4 @@ class CameraMan { block() session.commitConfiguration() } - - // MARK: - Preset - - func configurePreset(_ input: AVCaptureDeviceInput) { - for asset in preferredPresets() { - if input.device.supportsSessionPreset(AVCaptureSession.Preset(rawValue: asset)) && self.session.canSetSessionPreset(AVCaptureSession.Preset(rawValue: asset)) { - self.session.sessionPreset = AVCaptureSession.Preset(rawValue: asset) - return - } - } - } - - func preferredPresets() -> [String] { - return [ - AVCaptureSession.Preset.high.rawValue, - AVCaptureSession.Preset.medium.rawValue, - AVCaptureSession.Preset.low.rawValue, - ] - } } diff --git a/Source/CameraView/CameraView.swift b/Source/CameraView/CameraView.swift index 3a752358..fb0bf9a5 100644 --- a/Source/CameraView/CameraView.swift +++ b/Source/CameraView/CameraView.swift @@ -153,7 +153,7 @@ class CameraView: UIViewController, CLLocationManagerDelegate, CameraManDelegate layer.backgroundColor = configuration.mainColor.cgColor layer.autoreverses = true - layer.videoGravity = AVLayerVideoGravity.resizeAspectFill + layer.videoGravity = AVLayerVideoGravity.resizeAspect view.layer.insertSublayer(layer, at: 0) layer.frame = view.layer.frame From 2bffc7a60fa7e240be6e897617276e5d42cc51bd Mon Sep 17 00:00:00 2001 From: Ahmed El Moden Date: Thu, 22 Feb 2024 14:02:40 +0100 Subject: [PATCH 5/5] Bugfix: Use of builtInTripleCamera first. --- Source/CameraView/CameraMan.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/CameraView/CameraMan.swift b/Source/CameraView/CameraMan.swift index 03085d41..d99b822f 100644 --- a/Source/CameraView/CameraMan.swift +++ b/Source/CameraView/CameraMan.swift @@ -45,11 +45,11 @@ class CameraMan { } } - let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInUltraWideCamera, .builtInDualCamera, .builtInWideAngleCamera], mediaType: .video, position: .back) + let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInDualCamera, .builtInWideAngleCamera], mediaType: .video, position: .back) var selectedDevice: AVCaptureDevice? // Attempt to find a triple camera first - if let tripleCameraDevice = discoverySession.devices.first(where: { $0.deviceType == .builtInUltraWideCamera }) { + if let tripleCameraDevice = discoverySession.devices.first(where: { $0.deviceType == .builtInTripleCamera }) { selectedDevice = tripleCameraDevice } else if let dualCameraDevice = discoverySession.devices.first(where: { $0.deviceType == .builtInDualCamera }) { // Fallback to dual camera if no triple camera is found