From 1dc3d7f6aa7ae9b235a9ea0c5210e5ba4207eb44 Mon Sep 17 00:00:00 2001 From: nelanelanela Date: Mon, 13 Oct 2014 13:36:21 +0100 Subject: [PATCH] Front and back camera selection --- .../UserInterfaceState.xcuserstate | Bin 41689 -> 42443 bytes camera/Base.lproj/Main.storyboard | 21 +++++- camera/CameraManager.swift | 63 +++++++++++++++++- camera/ViewController.swift | 10 ++- 4 files changed, 87 insertions(+), 7 deletions(-) diff --git a/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate b/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate index 0e6912d1a9b1624a04de33da9ef755e1aea7a012..94dc31ae6081823be2ff219bda0d3d98a48ca2cc 100644 GIT binary patch delta 15435 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
U9!>l@aOt)E&yxBkZlvtikA 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 - + + - + + + diff --git a/camera/CameraManager.swift b/camera/CameraManager.swift index c22afaf..c118d3a 100644 --- a/camera/CameraManager.swift +++ b/camera/CameraManager.swift @@ -9,14 +9,52 @@ import UIKit import AVFoundation +enum CameraDevice { + case Front + case Back +} + private let _singletonSharedInstance = CameraManager() class CameraManager: NSObject { + var hasFrontCamera = false var captureSession: AVCaptureSession? var showErrorBlock:(erTitle: String, erMessage: String) -> Void = { (erTitle: String, erMessage: String) -> Void in UIAlertView(title: erTitle, message: erMessage, delegate: nil, cancelButtonTitle: "OK").show() } + var cameraDevice: CameraDevice { + get { + return self.currentCameraDevice + } + set(newCameraDevice) { + if newCameraDevice != self.currentCameraDevice { + self.captureSession?.beginConfiguration() + + switch newCameraDevice { + case .Front: + if self.hasFrontCamera { + if let validBackDevice = self.rearCamera? { + self.captureSession?.removeInput(validBackDevice) + } + if let validFrontDevice = self.frontCamera? { + self.captureSession?.addInput(validFrontDevice) + } + } + case .Back: + if let validFrontDevice = self.frontCamera? { + self.captureSession?.removeInput(validFrontDevice) + } + if let validBackDevice = self.rearCamera? { + self.captureSession?.addInput(validBackDevice) + } + } + self.captureSession?.commitConfiguration() + + self.currentCameraDevice = newCameraDevice + } + } + } private var sessionQueue: dispatch_queue_t = dispatch_queue_create("CameraSessionQueue", DISPATCH_QUEUE_SERIAL) private var frontCamera: AVCaptureInput? @@ -24,6 +62,7 @@ class CameraManager: NSObject { private var stillImageOutput: AVCaptureStillImageOutput? private var previewLayer: AVCaptureVideoPreviewLayer? private var cameraIsSetup = false + private var currentCameraDevice = CameraDevice.Back private weak var embedingView: UIView? class var sharedInstance: CameraManager { @@ -31,12 +70,17 @@ class CameraManager: NSObject { } deinit { - self.stopCaptureSession() + self.stopAndRemoveCaptureSession() self._stopFollowingDeviceOrientation() } func addPreeviewLayerToView(view: UIView) { + if let validEmbedingView = self.embedingView? { + if let validPreviewLayer = self.previewLayer? { + validPreviewLayer.removeFromSuperlayer() + } + } if self.cameraIsSetup { self._addPreeviewLayerToView(view) } else { @@ -50,7 +94,19 @@ class CameraManager: NSObject { { self.captureSession?.stopRunning() } - + + func stopAndRemoveCaptureSession() + { + self.stopCaptureSession() + self.cameraDevice = .Back + self.cameraIsSetup = false + self.previewLayer = nil + self.captureSession = nil + self.frontCamera = nil + self.rearCamera = nil + self.stillImageOutput = nil + } + func capturePictureWithCompletition(imageCompletition: UIImage -> Void) { if self.cameraIsSetup { @@ -126,11 +182,11 @@ class CameraManager: NSObject { private func _addPreeviewLayerToView(view: UIView) { + self.embedingView = view dispatch_async(dispatch_get_main_queue(), { () -> Void in self.previewLayer?.frame = view.layer.bounds view.clipsToBounds = true view.layer.addSublayer(self.previewLayer) - self.embedingView = view }) } @@ -158,6 +214,7 @@ class CameraManager: NSObject { } if let validVideoFrontDevice = videoFrontDevice? { self.frontCamera = AVCaptureDeviceInput.deviceInputWithDevice(validVideoFrontDevice, error: &error) as AVCaptureDeviceInput + self.hasFrontCamera = true } if let validVideoBackDevice = videoBackDevice? { self.rearCamera = AVCaptureDeviceInput.deviceInputWithDevice(validVideoBackDevice, error: &error) as AVCaptureDeviceInput diff --git a/camera/ViewController.swift b/camera/ViewController.swift index d784a8e..28aea2f 100644 --- a/camera/ViewController.swift +++ b/camera/ViewController.swift @@ -15,13 +15,15 @@ class ViewController: UIViewController { @IBOutlet weak var cameraView: UIView! @IBOutlet weak var imageView: UIImageView! - override func viewDidLoad() { + override func viewDidLoad() + { super.viewDidLoad() self.cameraManager.addPreeviewLayerToView(self.cameraView) self.imageView.hidden = true } - @IBAction func viewTapped(sender: UITapGestureRecognizer) { + @IBAction func viewTapped(sender: UITapGestureRecognizer) + { if self.cameraView.hidden == true { self.cameraView.hidden = false self.imageView.hidden = true @@ -33,6 +35,10 @@ class ViewController: UIViewController { }) } } + @IBAction func changeCameraDevice(sender: UIButton) + { + self.cameraManager.cameraDevice = self.cameraManager.cameraDevice == CameraDevice.Front ? CameraDevice.Back : CameraDevice.Front + } }