web-dev-qa-db-fra.com

Swift 3 - Vue personnalisée de la caméra AVCapture

Je suivais cette vidéo pour créer une vue de caméra personnalisée. https://www.youtube.com/watch?v=w0O3ZGUS3pk

cependant, en raison d'iOS 10 et de Swift 3 changements, beaucoup de choses n'étaient plus pertinentes

ce qui suit est le code que je suis sorti après avoir changé la fonction obsolète pour les nouvelles .. cependant il n'y a pas d'erreur, mais aussi ne pas voir un aperçu sur l'UIView

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCapturePhotoCaptureDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    @IBOutlet weak var cameraView: UIView!
    var captureSession = AVCaptureSession();
    var sessionOutput = AVCapturePhotoOutput();
    var sessionOutputSetting = AVCapturePhotoSettings(format: [AVVideoCodecKey:AVVideoCodecJPEG]);
    var previewLayer = AVCaptureVideoPreviewLayer();

    override func viewWillAppear(_ animated: Bool) {
        let deviceDiscoverySession = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInDuoCamera, AVCaptureDeviceType.builtInTelephotoCamera,AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.unspecified)
        for device in (deviceDiscoverySession?.devices)! {
            if(device.position == AVCaptureDevicePosition.front){
                do{
                    let input = try AVCaptureDeviceInput(device: device)
                    if(captureSession.canAddInput(input)){
                        captureSession.addInput(input);

                        if(captureSession.canAddOutput(sessionOutput)){
                            captureSession.addOutput(sessionOutput);
                            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
                            previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
                            previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait;
                            cameraView.layer.addSublayer(previewLayer);
                        }
                    }
                }
                catch{
                    print("exception!");
                }
            }
        }
    }
12
Jeff Huang

Vous avez oublié de démarrer votre session:

captureSession.startRunning()

et définissez le cadre de votre previewLayer:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    previewLayer.frame = cameraView.bounds
}

p.s. Une fois que vous avez ajouté vos entrées et sorties de session, vous devez sortir de cette boucle.

18
Rhythmic Fistman