diff --git a/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate b/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate index 0e6912d..94dc31a 100644 Binary files a/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate and b/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/camera/Base.lproj/Main.storyboard b/camera/Base.lproj/Main.storyboard index 418ba57..271ef1d 100644 --- a/camera/Base.lproj/Main.storyboard +++ b/camera/Base.lproj/Main.storyboard @@ -18,21 +18,38 @@ - + + - + + + 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 + } }