From d837d4d71eb9ec8ff32df8d183d357e256e3985a Mon Sep 17 00:00:00 2001 From: Andrew Walz Date: Wed, 6 Sep 2017 12:33:59 -0600 Subject: [PATCH] Added optional delegate methods for running session and added enabled property to SwiftyCamButton --- .../DemoSwiftyCam/ViewController.swift | 91 +++++++++++++------ Source/SwiftyCamButton.swift | 12 +++ Source/SwiftyCamViewController.swift | 8 +- Source/SwiftyCamViewControllerDelegate.swift | 26 ++++++ 4 files changed, 106 insertions(+), 31 deletions(-) diff --git a/DemoSwiftyCam/DemoSwiftyCam/ViewController.swift b/DemoSwiftyCam/DemoSwiftyCam/ViewController.swift index 6f9636c..69b087d 100644 --- a/DemoSwiftyCam/DemoSwiftyCam/ViewController.swift +++ b/DemoSwiftyCam/DemoSwiftyCam/ViewController.swift @@ -18,10 +18,9 @@ import UIKit class ViewController: SwiftyCamViewController, SwiftyCamViewControllerDelegate { - @IBOutlet weak var captureButton: SwiftyRecordButton! - @IBOutlet weak var flipCameraButton: UIButton! - @IBOutlet weak var flashButton: UIButton! - + @IBOutlet weak var captureButton : SwiftyRecordButton! + @IBOutlet weak var flipCameraButton : UIButton! + @IBOutlet weak var flashButton : UIButton! override func viewDidLoad() { super.viewDidLoad() @@ -31,6 +30,9 @@ class ViewController: SwiftyCamViewController, SwiftyCamViewControllerDelegate { shouldUseDeviceOrientation = true allowAutoRotate = true audioEnabled = true + + // disable capture button until session starts + captureButton.buttonEnabled = false } override var prefersStatusBarHidden: Bool { @@ -41,6 +43,17 @@ class ViewController: SwiftyCamViewController, SwiftyCamViewControllerDelegate { super.viewDidAppear(animated) captureButton.delegate = self } + + func swiftyCamSessionDidStartRunning(_ swiftyCam: SwiftyCamViewController) { + print("Session did start running") + captureButton.buttonEnabled = true + } + + func swiftyCamSessionDidStopRunning(_ swiftyCam: SwiftyCamViewController) { + print("Session did stop running") + captureButton.buttonEnabled = false + } + func swiftyCam(_ swiftyCam: SwiftyCamViewController, didTake photo: UIImage) { let newVC = PhotoViewController(image: photo) @@ -50,19 +63,13 @@ class ViewController: SwiftyCamViewController, SwiftyCamViewControllerDelegate { func swiftyCam(_ swiftyCam: SwiftyCamViewController, didBeginRecordingVideo camera: SwiftyCamViewController.CameraSelection) { print("Did Begin Recording") captureButton.growButton() - UIView.animate(withDuration: 0.25, animations: { - self.flashButton.alpha = 0.0 - self.flipCameraButton.alpha = 0.0 - }) + hideButtons() } func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFinishRecordingVideo camera: SwiftyCamViewController.CameraSelection) { print("Did finish Recording") captureButton.shrinkButton() - UIView.animate(withDuration: 0.25, animations: { - self.flashButton.alpha = 1.0 - self.flipCameraButton.alpha = 1.0 - }) + showButtons() } func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFinishProcessVideoAt url: URL) { @@ -71,22 +78,8 @@ class ViewController: SwiftyCamViewController, SwiftyCamViewControllerDelegate { } func swiftyCam(_ swiftyCam: SwiftyCamViewController, didFocusAtPoint point: CGPoint) { - let focusView = UIImageView(image: #imageLiteral(resourceName: "focus")) - focusView.center = point - focusView.alpha = 0.0 - view.addSubview(focusView) - - UIView.animate(withDuration: 0.25, delay: 0.0, options: .curveEaseInOut, animations: { - focusView.alpha = 1.0 - focusView.transform = CGAffineTransform(scaleX: 1.25, y: 1.25) - }, completion: { (success) in - UIView.animate(withDuration: 0.15, delay: 0.5, options: .curveEaseInOut, animations: { - focusView.alpha = 0.0 - focusView.transform = CGAffineTransform(translationX: 0.6, y: 0.6) - }, completion: { (success) in - focusView.removeFromSuperview() - }) - }) + print("Did focus at point: \(point)") + focusAnimationAt(point) } func swiftyCamDidFailToConfigure(_ swiftyCam: SwiftyCamViewController) { @@ -103,7 +96,6 @@ class ViewController: SwiftyCamViewController, SwiftyCamViewControllerDelegate { func swiftyCam(_ swiftyCam: SwiftyCamViewController, didSwitchCameras camera: SwiftyCamViewController.CameraSelection) { print("Camera did change to \(camera.rawValue)") - print(camera) } @@ -117,7 +109,48 @@ class ViewController: SwiftyCamViewController, SwiftyCamViewControllerDelegate { @IBAction func toggleFlashTapped(_ sender: Any) { flashEnabled = !flashEnabled + toggleFlashAnimation() + } +} + + +// UI Animations +extension ViewController { + + fileprivate func hideButtons() { + UIView.animate(withDuration: 0.25) { + self.flashButton.alpha = 0.0 + self.flipCameraButton.alpha = 0.0 + } + } + + fileprivate func showButtons() { + UIView.animate(withDuration: 0.25) { + self.flashButton.alpha = 1.0 + self.flipCameraButton.alpha = 1.0 + } + } + + fileprivate func focusAnimationAt(_ point: CGPoint) { + let focusView = UIImageView(image: #imageLiteral(resourceName: "focus")) + focusView.center = point + focusView.alpha = 0.0 + view.addSubview(focusView) + UIView.animate(withDuration: 0.25, delay: 0.0, options: .curveEaseInOut, animations: { + focusView.alpha = 1.0 + focusView.transform = CGAffineTransform(scaleX: 1.25, y: 1.25) + }) { (success) in + UIView.animate(withDuration: 0.15, delay: 0.5, options: .curveEaseInOut, animations: { + focusView.alpha = 0.0 + focusView.transform = CGAffineTransform(translationX: 0.6, y: 0.6) + }) { (success) in + focusView.removeFromSuperview() + } + } + } + + fileprivate func toggleFlashAnimation() { if flashEnabled == true { flashButton.setImage(#imageLiteral(resourceName: "flash"), for: UIControlState()) } else { diff --git a/Source/SwiftyCamButton.swift b/Source/SwiftyCamButton.swift index dce4162..a9e2448 100644 --- a/Source/SwiftyCamButton.swift +++ b/Source/SwiftyCamButton.swift @@ -54,6 +54,10 @@ open class SwiftyCamButton: UIButton { public weak var delegate: SwiftyCamButtonDelegate? + // Sets whether button is enabled + + public var buttonEnabled = true + /// Maximum duration variable fileprivate var timer : Timer? @@ -76,11 +80,19 @@ open class SwiftyCamButton: UIButton { /// UITapGestureRecognizer Function @objc fileprivate func Tap() { + guard buttonEnabled == true else { + return + } + delegate?.buttonWasTapped() } /// UILongPressGestureRecognizer Function @objc fileprivate func LongPress(_ sender:UILongPressGestureRecognizer!) { + guard buttonEnabled == true else { + return + } + switch sender.state { case .began: delegate?.buttonDidBeginLongPress() diff --git a/Source/SwiftyCamViewController.swift b/Source/SwiftyCamViewController.swift index 5f51dab..1c1a8b5 100644 --- a/Source/SwiftyCamViewController.swift +++ b/Source/SwiftyCamViewController.swift @@ -359,8 +359,6 @@ open class SwiftyCamViewController: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(captureSessionDidStopRunning), name: .AVCaptureSessionDidStopRunning, object: nil) } - - // MARK: ViewDidAppear /// ViewDidAppear(_ animated:) Implementation @@ -1033,12 +1031,18 @@ open class SwiftyCamViewController: UIViewController { @objc private func captureSessionDidStartRunning() { sessionRunning = true + DispatchQueue.main.async { + self.cameraDelegate?.swiftyCamSessionDidStartRunning(self) + } } /// Called when Notification Center registers session stops running @objc private func captureSessionDidStopRunning() { sessionRunning = false + DispatchQueue.main.async { + self.cameraDelegate?.swiftyCamSessionDidStopRunning(self) + } } } diff --git a/Source/SwiftyCamViewControllerDelegate.swift b/Source/SwiftyCamViewControllerDelegate.swift index 120312e..d2e8ee8 100644 --- a/Source/SwiftyCamViewControllerDelegate.swift +++ b/Source/SwiftyCamViewControllerDelegate.swift @@ -23,6 +23,24 @@ import AVFoundation public protocol SwiftyCamViewControllerDelegate: class { + /** + SwiftyCamViewControllerDelegate function called when when SwiftyCamViewController session did start running. + Photos and video capture will be enabled. + + - Parameter swiftyCam: Current SwiftyCamViewController + */ + + func swiftyCamSessionDidStartRunning(_ swiftyCam: SwiftyCamViewController) + + /** + SwiftyCamViewControllerDelegate function called when when SwiftyCamViewController session did stops running. + Photos and video capture will be disabled. + + - Parameter swiftyCam: Current SwiftyCamViewController + */ + + func swiftyCamSessionDidStopRunning(_ swiftyCam: SwiftyCamViewController) + /** SwiftyCamViewControllerDelegate function called when the takePhoto() function is called. @@ -116,6 +134,14 @@ public protocol SwiftyCamViewControllerDelegate: class { public extension SwiftyCamViewControllerDelegate { + func swiftyCamSessionDidStopRunning(_ swiftyCam: SwiftyCamViewController) { + // Optional + } + + func swiftyCamSessionDidStartRunning(_ swiftyCam: SwiftyCamViewController) { + // Optional + } + func swiftyCam(_ swiftyCam: SwiftyCamViewController, didTake photo: UIImage) { // Optional }