From cb473b47061f27cab236b4902797066eaddee71e Mon Sep 17 00:00:00 2001 From: nelanelanela Date: Wed, 15 Oct 2014 13:45:19 +0100 Subject: [PATCH] Reliability improved. --- .../UserInterfaceState.xcuserstate | Bin 43721 -> 44146 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 18 ------ camera/Base.lproj/Main.storyboard | 38 +++++++---- camera/CameraManager.swift | 59 +++++++++++------- camera/ViewController.swift | 38 ++++++++--- 5 files changed, 91 insertions(+), 62 deletions(-) diff --git a/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate b/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate index d490e12b964a70b25d58c3432797e0981b1b555d..84bd0c817893871b00b1229688af22f64793d5b2 100644 GIT binary patch delta 17679 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 E0nwVimH+?% delta 17625 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 diff --git a/camera.xcodeproj/xcuserdata/nataliaterlecka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/camera.xcodeproj/xcuserdata/nataliaterlecka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 6e00952..fe2b454 100644 --- a/camera.xcodeproj/xcuserdata/nataliaterlecka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/camera.xcodeproj/xcuserdata/nataliaterlecka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,22 +2,4 @@ - - - - - - diff --git a/camera/Base.lproj/Main.storyboard b/camera/Base.lproj/Main.storyboard index fbff775..99d6bf1 100644 --- a/camera/Base.lproj/Main.storyboard +++ b/camera/Base.lproj/Main.storyboard @@ -24,11 +24,22 @@ + - @@ -77,6 +84,8 @@ + + @@ -86,13 +95,18 @@ + + + + + diff --git a/camera/CameraManager.swift b/camera/CameraManager.swift index 2a27bb9..2dc0132 100644 --- a/camera/CameraManager.swift +++ b/camera/CameraManager.swift @@ -31,6 +31,12 @@ enum CameraOutputQuality { /// Class for handling iDevices custom camera usage class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { + /// Capture sessioc to customize camera settings. + var captureSession: AVCaptureSession? + + /// Property to determine if the manager should show the error for the user. + var showErrorsToUsers = true + /// The Bool property to determin if current device has front camera. var hasFrontCamera: Bool = { let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) @@ -201,9 +207,6 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { } } - /// Capture sessioc to customize camera settings. - var captureSession: AVCaptureSession? - private weak var embedingView: UIView? private var videoCompletition: ((videoURL: NSURL) -> Void)? @@ -382,19 +385,21 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { @objc private func _orientationChanged() { if let validPreviewLayer = self.previewLayer? { - switch UIDevice.currentDevice().orientation { - case .LandscapeLeft: - validPreviewLayer.connection.videoOrientation = .LandscapeRight - case .LandscapeRight: - validPreviewLayer.connection.videoOrientation = .LandscapeLeft - default: - validPreviewLayer.connection.videoOrientation = .Portrait - } - dispatch_async(dispatch_get_main_queue(), { () -> Void in - if let validEmbedingView = self.embedingView? { - validPreviewLayer.frame = validEmbedingView.bounds + if let validPreviewLayerConnection = validPreviewLayer.connection? { + switch UIDevice.currentDevice().orientation { + case .LandscapeLeft: + validPreviewLayerConnection.videoOrientation = .LandscapeRight + case .LandscapeRight: + validPreviewLayerConnection.videoOrientation = .LandscapeLeft + default: + validPreviewLayerConnection.videoOrientation = .Portrait } - }) + dispatch_async(dispatch_get_main_queue(), { () -> Void in + if let validEmbedingView = self.embedingView? { + validPreviewLayer.frame = validEmbedingView.bounds + } + }) + } } } @@ -409,9 +414,8 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { validCaptureSession.beginConfiguration() self._addVideoInput() self._setupStillImageOutput() - if let validStillImageOutput = self.stillImageOutput? { - self.captureSession?.addOutput(self.stillImageOutput) - } + self._setupMovieOutput() + self.cameraOutputMode = self.currentCameraOutputMode self._setupPreviewLayer() validCaptureSession.commitConfiguration() validCaptureSession.startRunning() @@ -471,6 +475,9 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { if let validVideoBackDevice = videoBackDevice? { self.rearCamera = AVCaptureDeviceInput.deviceInputWithDevice(validVideoBackDevice, error: &error) as AVCaptureDeviceInput } + if let validError = error? { + self._show("Device setup error occured", message: validError.localizedDescription) + } self.cameraDevice = self.currentCameraDevice } @@ -480,7 +487,7 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { var error: NSError? let micDevice:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio); self.mic = AVCaptureDeviceInput.deviceInputWithDevice(micDevice, error: &error) as? AVCaptureDeviceInput; - if let errorHappened = error { + if let errorHappened = error? { self.mic = nil self._show("Mic error", message: errorHappened.description) } @@ -503,14 +510,18 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { private func _setupPreviewLayer() { - self.previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) - self.previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill + if let validCaptureSession = self.captureSession? { + self.previewLayer = AVCaptureVideoPreviewLayer(session: validCaptureSession) + self.previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill + } } private func _show (title: String, message: String) { - dispatch_async(dispatch_get_main_queue(), { () -> Void in - self.showErrorBlock(erTitle: title, erMessage: message) - }) + if self.showErrorsToUsers { + dispatch_async(dispatch_get_main_queue(), { () -> Void in + self.showErrorBlock(erTitle: title, erMessage: message) + }) + } } } diff --git a/camera/ViewController.swift b/camera/ViewController.swift index 1c7179d..e9dd6ff 100644 --- a/camera/ViewController.swift +++ b/camera/ViewController.swift @@ -14,6 +14,7 @@ class ViewController: UIViewController { @IBOutlet weak var cameraView: UIView! @IBOutlet weak var imageView: UIImageView! + @IBOutlet weak var cameraButton: UIButton! override func viewDidLoad() { @@ -38,15 +39,36 @@ class ViewController: UIViewController { @IBAction func recordButtonTapped(sender: UIButton) { - sender.selected = !sender.selected - sender.backgroundColor = sender.selected ? UIColor.redColor() : UIColor.greenColor() - if sender.selected { - self.cameraManager.startRecordingVideo() - } else { - self.cameraManager.stopRecordingVideo({ (videoURL) -> Void in - println("YEEEEEEY ! ! ") - println(videoURL) + switch (self.cameraManager.cameraOutputMode) { + case .StillImage: + self.cameraManager.capturePictureWithCompletition({ (image) -> Void in + }) + case .VideoWithMic, .VideoOnly: + sender.selected = !sender.selected + sender.setTitle(" ", forState: UIControlState.Selected) + sender.backgroundColor = sender.selected ? UIColor.redColor() : UIColor.greenColor() + if sender.selected { + self.cameraManager.startRecordingVideo() + } else { + self.cameraManager.stopRecordingVideo({ (videoURL) -> Void in + println("YEEEEEEY ! ! ") + println(videoURL) + }) + } + } + } + + @IBAction func outputModeButtonTapped(sender: UIButton) + { + self.cameraManager.cameraOutputMode = self.cameraManager.cameraOutputMode == CameraOutputMode.VideoWithMic ? CameraOutputMode.StillImage : CameraOutputMode.VideoWithMic + switch (self.cameraManager.cameraOutputMode) { + case .StillImage: + self.cameraButton.selected = false + self.cameraButton.backgroundColor = UIColor.greenColor() + sender.setTitle("Image", forState: UIControlState.Normal) + case .VideoWithMic, .VideoOnly: + sender.setTitle("Video", forState: UIControlState.Normal) } }