繁体   English   中英

如何在 swift 中将相机视图扩展到全屏 - UIImagePickerController

[英]How to expand camera view to full screen in swift - UIImagePickerController

我正在使用 UIImagePickerController 用 pone 拍一张照片,然后在应用程序中使用该照片。

这是我启动相机的代码:

imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .Camera
imagePicker.showsCameraControls = false
imagePicker.cameraOverlayView = customViewTakePhoto()

presentViewController(imagePicker, animated: true, completion: nil)

一切正常,相机启动,拍摄后我可以获取照片,但只有一件事我无法弄清楚,那就是:

在拍摄照片之前,如何在整个屏幕上显示相机视图?

以下是准确显示我需要的图像

这是我现在的观点(我强烈推荐这本书,顺便说一句):

在此处输入图片说明

这就是我需要的(全屏相机视图):

在此处输入图片说明

import UIKit
import AVFoundation

class CameraViewController: UIViewController {

    // MARK: @IBOutlet

    @IBOutlet weak var overlayCamera: UIView! 
    @IBOutlet weak var capturedImage: UIImageView! 

    // MARK: Local Variables

    var captureSession: AVCaptureSession?
    var stillImageOutput: AVCaptureStillImageOutput?
    var previewLayer: AVCaptureVideoPreviewLayer?

    // MARK: Overrides

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        previewLayer!.frame = overlayCamera.bounds
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action: "cameraDidTap")
        overlayCamera.addGestureRecognizer(tapGesture)
    }

    override func viewWillAppear(animated: Bool) {
        self.navigationController?.setNavigationBarHidden(true, animated: false)
        super.viewWillAppear(animated)

        captureSession = AVCaptureSession()
        captureSession!.sessionPreset = AVCaptureSessionPresetPhoto

        let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

        var error: NSError?
        var input: AVCaptureDeviceInput!
        do {
            input = try AVCaptureDeviceInput(device: backCamera)
        } catch let error1 as NSError {
            error = error1
            input = nil
        }

        if error == nil && captureSession!.canAddInput(input) {
            captureSession!.addInput(input)

            stillImageOutput = AVCaptureStillImageOutput()
            stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
            if captureSession!.canAddOutput(stillImageOutput) {
                captureSession!.addOutput(stillImageOutput)

                previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
                previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait
                overlayCamera.layer.addSublayer(previewLayer!)

                captureSession!.startRunning()
            }
        }
    }

    override func viewWillDisappear(animated: Bool) {
        self.navigationController?.setNavigationBarHidden(false, animated: false)
        super.viewWillDisappear(animated)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // function for UITapGestureRecognizer for camera tap
    func cameraDidTap() {

        if let videoConnection = stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {
            videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
            stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {(sampleBuffer, error) in
                if (sampleBuffer != nil) {
                    let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
                    let dataProvider = CGDataProviderCreateWithCFData(imageData)
                    let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)

                    let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
                    self.capturedImage.image = image
                }
            })
        }
    }
}

在 previewLayer 中,只需将 videoGravity 设置为 aspectFill:

let previewLayer = AVCaptureVideoPreviewLayer()

previewLayer.videoGravity = .resizeAspectFill

这个对我有用:

设置AVCaptureSession()

let captureSession = AVCaptureSession()

guard let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .back) else { return }
guard let input = try? AVCaptureDeviceInput(device: captureDevice) else { return }    
captureSession.addInput(input)
captureSession.startRunning()

设置AVCaptureVideoPreviewLayer()

let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.videoGravity = .resizeAspectFill
view.layer.addSublayer(previewLayer)
previewLayer.frame = view.frame

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM