From 6c76ae1fb8b5d24f3bdaafdb8646483ce9efad24 Mon Sep 17 00:00:00 2001 From: nelanelanela Date: Wed, 15 Oct 2014 17:38:38 +0100 Subject: [PATCH] Resources only recreated when needed. --- README.md | 8 +- .../UserInterfaceState.xcuserstate | Bin 43947 -> 43570 bytes camera/CameraManager.swift | 86 +++++++++++------- camera/ViewController.swift | 4 +- 4 files changed, 59 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 78f2abd..e738edc 100755 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ ####Camera Manager -V1.0.0 (10-Oct-2014) +V1.0.2 (15-Oct-2014) ####About -This is a simple class to provide all the configurations you need to create custom camera view in your app. +This is a simple swift class to provide all the configurations you need to create custom camera view in your app. Just drag, drop and use. -### Installation with CocoaPods +####Installation with CocoaPods The easiest way to install the CameraManager is with: [CocoaPods](http://cocoapods.org) -#### Podfile +## Podfile ```ruby platform :ios, '7.0' diff --git a/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate b/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate index d4f6477a8b7388beb9e8c219e83b0696935f54b1..cc1c7122a8846d0cbc0d873413f92102ea93d3c2 100644 GIT binary patch delta 17835 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 Void in + if (error? != nil) { + dispatch_async(dispatch_get_main_queue(), { + weakSelf._show("error", message: error.localizedDescription) + }) + } + }) + } + } } }) } @@ -343,7 +356,7 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { } /** - Stop recording a video. + Stop recording a video. Save it to the cameraRoll and give back the url. */ func stopRecordingVideo(completition:(videoURL: NSURL) -> Void) { @@ -368,19 +381,20 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { if (error != nil) { self._show("Unable to save video to the iPhone", message: error.localizedDescription) } else { - let library = ALAssetsLibrary() - library.writeVideoAtPathToSavedPhotosAlbum(outputFileURL, completionBlock: { (assetURL: NSURL?, error: NSError?) -> Void in - if (error != nil) { - self._show("Unable to save video to the iPhone.", message: error!.localizedDescription) - } else { - if let validCompletition = self.videoCompletition { - if let validAssetURL = assetURL { - validCompletition(videoURL: validAssetURL) - self.videoCompletition = nil + if let validLibrary = self.library? { + validLibrary.writeVideoAtPathToSavedPhotosAlbum(outputFileURL, completionBlock: { (assetURL: NSURL?, error: NSError?) -> Void in + if (error != nil) { + self._show("Unable to save video to the iPhone.", message: error!.localizedDescription) + } else { + if let validCompletition = self.videoCompletition { + if let validAssetURL = assetURL { + validCompletition(videoURL: validAssetURL) + self.videoCompletition = nil + } } } - } - }) + }) + } } } @@ -462,24 +476,29 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { { var error: NSError? - var videoFrontDevice: AVCaptureDevice? - var videoBackDevice: AVCaptureDevice? - for device: AnyObject in AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) { - if device.position == AVCaptureDevicePosition.Back { - videoBackDevice = device as? AVCaptureDevice - } else if device.position == AVCaptureDevicePosition.Front { - videoFrontDevice = device as? AVCaptureDevice + if (self.frontCamera? == nil) || (self.rearCamera? == nil) { + var videoFrontDevice: AVCaptureDevice? + var videoBackDevice: AVCaptureDevice? + for device: AnyObject in AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) { + if device.position == AVCaptureDevicePosition.Back { + videoBackDevice = device as? AVCaptureDevice + } else if device.position == AVCaptureDevicePosition.Front { + videoFrontDevice = device as? AVCaptureDevice + } + } + if (self.frontCamera? == nil) { + if let validVideoFrontDevice = videoFrontDevice? { + self.frontCamera = AVCaptureDeviceInput.deviceInputWithDevice(validVideoFrontDevice, error: &error) as AVCaptureDeviceInput + } + } + if (self.rearCamera? == nil) { + 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) } - } - 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 - } - if let validError = error? { - self._show("Device setup error occured", message: validError.localizedDescription) } self.cameraDevice = self.currentCameraDevice } @@ -505,6 +524,9 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { if (self.movieOutput == nil) { self.movieOutput = AVCaptureMovieFileOutput() } + if self.library == nil { + self.library = ALAssetsLibrary() + } } private func _setupPreviewLayer() diff --git a/camera/ViewController.swift b/camera/ViewController.swift index 7b722f7..0ce30a4 100644 --- a/camera/ViewController.swift +++ b/camera/ViewController.swift @@ -19,8 +19,7 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - self.cameraManager.addPreeviewLayerToView(self.cameraView, newCameraOutputMode: CameraOutputMode.VideoWithMic) - CameraManager.sharedInstance.addPreeviewLayerToView(self.cameraView) + self.cameraManager.addPreviewLayerToView(self.cameraView, newCameraOutputMode: CameraOutputMode.VideoWithMic) self.cameraManager.cameraDevice = .Front self.imageView.hidden = true CameraManager.sharedInstance.showErrorBlock = { (erTitle: String, erMessage: String) -> Void in @@ -56,7 +55,6 @@ class ViewController: UIViewController { self.cameraManager.startRecordingVideo() } else { self.cameraManager.stopRecordingVideo({ (videoURL) -> Void in - println("YEEEEEEY ! ! ") println(videoURL) }) }