Skip to content

Commit

Permalink
Extract view
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanmasondavies committed Sep 27, 2019
1 parent e6b42f7 commit f304d43
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 43 deletions.
4 changes: 4 additions & 0 deletions FaceDetection.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -42,6 +43,7 @@
944D02F819B5E52100324B81 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
944D02F919B5E52100324B81 /* FaceDetectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaceDetectionTests.swift; sourceTree = "<group>"; };
946291EC233EAB540061238B /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = "<group>"; };
949ADD7D233EB291001C47B2 /* FeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedView.swift; sourceTree = "<group>"; };
94C9E1F91CA72A3300B49860 /* PixellateImage.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = PixellateImage.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
94F494F91C3DE3D8008D88DF /* CameraFeed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraFeed.swift; sourceTree = "<group>"; };
94F494FB1C3DE41A008D88DF /* FaceObscurationFilter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaceObscurationFilter.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -89,6 +91,7 @@
children = (
944D02E619B5E52100324B81 /* AppDelegate.swift */,
944D02E819B5E52100324B81 /* FeedViewController.swift */,
949ADD7D233EB291001C47B2 /* FeedView.swift */,
94F494F91C3DE3D8008D88DF /* CameraFeed.swift */,
9425E0AD1CA88FBF004B49BB /* CoreImageAdditions.swift */,
9425E0AF1CA8908B004B49BB /* PixellationFilter.swift */,
Expand Down Expand Up @@ -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 */,
Expand Down
70 changes: 70 additions & 0 deletions FaceDetection/FeedView.swift
Original file line number Diff line number Diff line change
@@ -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)")
}
}
46 changes: 3 additions & 43 deletions FaceDetection/FeedViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
}

0 comments on commit f304d43

Please sign in to comment.