Fix the issue that "viewWillAppear" not called when PhotoVC dissmissed.
charlietsao opened this issue · comments
Ref : https://stackoverflow.com/a/60295024/2151275
Need to set the modalPresentationStyle
of PhotoVC
to full screen.
Full code of ViewController.swift
import UIKit
import AVFoundation
class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
let captureSession = AVCaptureSession()
var previewLayer:CALayer!
var captrueDevice:AVCaptureDevice!
var takePhoto = false
override func viewDidLoad() {
super.viewDidLoad()
prepareCamera()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.captureSession.startRunning()
}
func prepareCamera() {
captureSession.sessionPreset = AVCaptureSession.Preset.photo
let availableDeviceSession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back)
captrueDevice = availableDeviceSession.devices.first
beginSession()
}
func beginSession() {
do {
let captureDeviceInput = try AVCaptureDeviceInput(device: captrueDevice)
captureSession.addInput(captureDeviceInput)
} catch {
print(error.localizedDescription)
}
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
self.previewLayer = previewLayer
self.view.layer.addSublayer(self.previewLayer)
self.previewLayer.frame = self.view.layer.frame
captureSession.startRunning()
let dataOutput = AVCaptureVideoDataOutput()
dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as String): NSNumber(value: kCVPixelFormatType_32BGRA)]
captureSession.addOutput(dataOutput)
captureSession.commitConfiguration()
let queue = DispatchQueue(label: "com.czk.captureQueue")
dataOutput.setSampleBufferDelegate(self, queue: queue)
}
@IBAction func takePhoto(_ sender: Any) {
takePhoto = true
}
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
if takePhoto {
takePhoto = false
if let image = getImageFromSampleBuffer(buffer: sampleBuffer) {
DispatchQueue.main.async {
let photoVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "PhotoVC") as! PhotoViewController
photoVC.takenPhoto = image
photoVC.modalPresentationStyle = .fullScreen
self.present(photoVC, animated: true, completion: {
self.captureSession.stopRunning()
})
}
}
}
}
func getImageFromSampleBuffer(buffer:CMSampleBuffer) -> UIImage? {
if let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) {
let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
let context = CIContext()
let imageRect = CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(pixelBuffer), height: CVPixelBufferGetHeight(pixelBuffer))
if let image = context.createCGImage(ciImage, from: imageRect) {
return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .right)
}
}
return nil
}
}