[ad_1]
DOWNLOAD RESOURCES:
In iOS and Swift, in order to show up a camera and take a photo or record a video, we can use the default UIImagePickerController.
But sometimes, you want to create something minimalistic, simpler with custom design.
So let’s do that in this training. You’ll learn:
+ How to use AVKit and AVFoundation
+ Configure AVCaptureSession and AVCaptureDevice to take photos
+ Add UITapGestureRecognizer to switch from front facing camera to back facing camera
+ Save the taken photo to photos library
Let’s get started by downloading all the resources I prepared for you in this episode below!
DOWNLOAD RESOURCES:
*********
ABOUT CODE MASTERY
*********
Code Mastery is hosted by Duc Tran, founder of Developers Academy.
This is his free-style no notes, no teleprompter presentation and live coding broadcast with you guys everyday.
To join Duc’s free courses, register for free at
*********
MEET DUC TRAN
*********
Duc Tran is founder of Developers Academy, one of the world’s leading iOS, Android and Web development trainers.
More than 2,000,000 developers have studied his video trainings; 100,000 developers see his posts each month. Each year, Duc has helped 20,000 plus developers graduate from his online courses or video series.
*********
FREE TRAININGS IN IOS DEVELOPMENT
*********
To subscribe and get free tutorials, courses and weekly content, visit me at:
Connect with Duc on facebook:
Tweet him:
Get daily inspiration:
*********
SOURCE CODE IN THIS COURSE
*********
import UIKit
import AVFoundation
class CameraViewController : UIViewController
{
@IBOutlet weak var cameraButton: UIButton!
var captureSession = AVCaptureSession()
// which camera input do we want to use
var backFacingCamera: AVCaptureDevice?
var frontFacingCamera: AVCaptureDevice?
var currentDevice: AVCaptureDevice?
// output device
var stillImageOutput: AVCaptureStillImageOutput?
var stillImage: UIImage?
// camera preview layer
var cameraPreviewLayer: AVCaptureVideoPreviewLayer?
// double tap to switch from back to front facing camera
var toggleCameraGestureRecognizer = UITapGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
captureSession.sessionPreset = AVCaptureSessionPresetPhoto
let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as! [AVCaptureDevice]
for device in devices {
if device.position == .back {
backFacingCamera = device
} else if device.position == .front {
frontFacingCamera = device
}
}
// default device
currentDevice = frontFacingCamera
// configure the session with the output for capturing our still image
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]
do {
let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice)
captureSession.addInput(captureDeviceInput)
captureSession.addOutput(stillImageOutput)
// set up the camera preview layer
cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.addSublayer(cameraPreviewLayer!)
cameraPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
cameraPreviewLayer?.frame = view.layer.frame
view.bringSubview(toFront: cameraButton)
captureSession.startRunning()
// toggle the camera
toggleCameraGestureRecognizer.numberOfTapsRequired = 2
toggleCameraGestureRecognizer.addTarget(self, action: #selector(toggleCamera))
view.addGestureRecognizer(toggleCameraGestureRecognizer)
} catch let error {
print(error)
}
}
@objc private func toggleCamera() {
// start the configuration change
captureSession.beginConfiguration()
let newDevice = (currentDevice?.position == . back) ? frontFacingCamera : backFacingCamera
for input in captureSession.inputs {
captureSession.removeInput(input as! AVCaptureDeviceInput)
}
let cameraInput: AVCaptureDeviceInput
do {
cameraInput = try AVCaptureDeviceInput(device: newDevice)
} catch let error {
print(error)
return
}
if captureSession.canAddInput(cameraInput) {
captureSession.addInput(cameraInput)
}
currentDevice = newDevice
captureSession.commitConfiguration()
}