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
+ }
}