From f304d4341006d4d7b77971aa88d11b8313881f08 Mon Sep 17 00:00:00 2001 From: Ryan Mason-Davies Date: Fri, 27 Sep 2019 22:13:29 +0100 Subject: [PATCH] Extract view --- FaceDetection.xcodeproj/project.pbxproj | 4 ++ FaceDetection/FeedView.swift | 70 +++++++++++++++++++++++++ FaceDetection/FeedViewController.swift | 46 ++-------------- 3 files changed, 77 insertions(+), 43 deletions(-) create mode 100644 FaceDetection/FeedView.swift diff --git a/FaceDetection.xcodeproj/project.pbxproj b/FaceDetection.xcodeproj/project.pbxproj index 4357bd5..dec5312 100644 --- a/FaceDetection.xcodeproj/project.pbxproj +++ b/FaceDetection.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 944D02EE19B5E52100324B81 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 944D02ED19B5E52100324B81 /* Images.xcassets */; }; 944D02FA19B5E52100324B81 /* FaceDetectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 944D02F919B5E52100324B81 /* FaceDetectionTests.swift */; }; 946291ED233EAB540061238B /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 946291EC233EAB540061238B /* Launch.storyboard */; }; + 949ADD7E233EB291001C47B2 /* FeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949ADD7D233EB291001C47B2 /* FeedView.swift */; }; 94F494FA1C3DE3D8008D88DF /* CameraFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F494F91C3DE3D8008D88DF /* CameraFeed.swift */; }; 94F494FC1C3DE41A008D88DF /* FaceObscurationFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F494FB1C3DE41A008D88DF /* FaceObscurationFilter.swift */; }; /* End PBXBuildFile section */ @@ -42,6 +43,7 @@ 944D02F819B5E52100324B81 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 944D02F919B5E52100324B81 /* FaceDetectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaceDetectionTests.swift; sourceTree = ""; }; 946291EC233EAB540061238B /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = ""; }; + 949ADD7D233EB291001C47B2 /* FeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedView.swift; sourceTree = ""; }; 94C9E1F91CA72A3300B49860 /* PixellateImage.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = PixellateImage.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 94F494F91C3DE3D8008D88DF /* CameraFeed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraFeed.swift; sourceTree = ""; }; 94F494FB1C3DE41A008D88DF /* FaceObscurationFilter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaceObscurationFilter.swift; sourceTree = ""; }; @@ -89,6 +91,7 @@ children = ( 944D02E619B5E52100324B81 /* AppDelegate.swift */, 944D02E819B5E52100324B81 /* FeedViewController.swift */, + 949ADD7D233EB291001C47B2 /* FeedView.swift */, 94F494F91C3DE3D8008D88DF /* CameraFeed.swift */, 9425E0AD1CA88FBF004B49BB /* CoreImageAdditions.swift */, 9425E0AF1CA8908B004B49BB /* PixellationFilter.swift */, @@ -232,6 +235,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 949ADD7E233EB291001C47B2 /* FeedView.swift in Sources */, 94F494FC1C3DE41A008D88DF /* FaceObscurationFilter.swift in Sources */, 9425E0B01CA8908B004B49BB /* PixellationFilter.swift in Sources */, 944D02E919B5E52100324B81 /* FeedViewController.swift in Sources */, diff --git a/FaceDetection/FeedView.swift b/FaceDetection/FeedView.swift new file mode 100644 index 0000000..3196ab0 --- /dev/null +++ b/FaceDetection/FeedView.swift @@ -0,0 +1,70 @@ +// +// FeedView.swift +// FaceDetection +// +// Created by Ryan Davies on 27/09/2019. +// Copyright © 2019 Ryan Davies. All rights reserved. +// + +import UIKit +import AVFoundation + +class FeedView: UIView, CameraFeedDelegate { + lazy var cameraFeed: CameraFeed = { + let feed = CameraFeed() + feed.delegate = self + return feed + }() + + private let imageView: UIImageView = { + let imageView = UIImageView() + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + addSubview(imageView) + NSLayoutConstraint.activate([ + leftAnchor.constraint(equalTo: imageView.leftAnchor), + rightAnchor.constraint(equalTo: imageView.rightAnchor), + topAnchor.constraint(equalTo: imageView.topAnchor), + bottomAnchor.constraint(equalTo: imageView.bottomAnchor), + ]) + } + + required init?(coder: NSCoder) { + fatalError() + } + + override func didMoveToSuperview() { + guard superview != nil else { + cameraFeed.stopCaptureSession() + return + } + cameraFeed.startCaptureSession() + } + + func cameraFeed(_ cameraFeed: CameraFeed, didStartRunningCaptureSession captureSession: AVCaptureSession) { + print("Capture session started.") + } + + func cameraFeed(_ cameraFeed: CameraFeed, didStopRunningCaptureSession captureSession: AVCaptureSession) { + print("Capture session stopped.") + } + + func cameraFeed(_ cameraFeed: CameraFeed, didUpdateWithSampleBuffer sampleBuffer: CMSampleBuffer) { + guard let filter = FaceObscurationFilter(CMSampleBuffer: sampleBuffer) else { + return + } + DispatchQueue.main.async { + let image = filter.outputImage ?? filter.inputImage + self.imageView.image = UIImage(ciImage: image) + } + } + + func cameraFeed(_ cameraFeed: CameraFeed, didFailWithError error: Error) { + print("Failed with error: \(error)") + } +} diff --git a/FaceDetection/FeedViewController.swift b/FaceDetection/FeedViewController.swift index 8f75919..2ffd7f8 100644 --- a/FaceDetection/FeedViewController.swift +++ b/FaceDetection/FeedViewController.swift @@ -8,55 +8,15 @@ import UIKit import CoreImage -import AVFoundation class FeedViewController: UIViewController { - lazy var cameraFeed: CameraFeed = { - let controller = CameraFeed() - controller.delegate = self - return controller - }() - - var imageView: UIImageView { + var feedView: FeedView { get { - return self.view as! UIImageView + return self.view as! FeedView } } override func loadView() { - self.view = UIImageView() - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - cameraFeed.startCaptureSession() - } - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - cameraFeed.stopCaptureSession() - } -} - -extension FeedViewController : CameraFeedDelegate { - func cameraFeed(_ cameraFeed: CameraFeed, didStartRunningCaptureSession captureSession: AVCaptureSession) { - print("Capture session started.") - } - - func cameraFeed(_ cameraFeed: CameraFeed, didStopRunningCaptureSession captureSession: AVCaptureSession) { - print("Capture session stopped.") - } - - func cameraFeed(_ cameraFeed: CameraFeed, didFailWithError error: Error) { - print("Failed with error: \(error)") - } - - func cameraFeed(_ cameraFeed: CameraFeed, didUpdateWithSampleBuffer sampleBuffer: CMSampleBuffer) { - if let filter = FaceObscurationFilter(CMSampleBuffer: sampleBuffer) { - DispatchQueue.main.async { - let image = filter.outputImage ?? filter.inputImage - self.imageView.image = UIImage(ciImage: image) - } - } + self.view = FeedView() } }