使用IOS相机预览图层填充视图

use*_*111 2 ios swift

完成教程,我正在尝试进行全屏预览.目前,我的相机看起来非常方形,我相信这可能是一个方面适合的问题.相机似乎打到左右两侧.如何将我的预览固定到导航栏底部和屏幕底部以及两侧?

import UIKit
import AVFoundation

class HomeViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    let captureSession = AVCaptureSession()
    var previewLayer:CALayer!

    var captureDevice:AVCaptureDevice!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        prepareCamera()
    }

    func prepareCamera(){
        captureSession.sessionPreset = AVCaptureSessionPresetPhoto

        if let availableDevices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back).devices {
            captureDevice = availableDevices.first
            beginSession()
        }
    }

    func beginSession () {
        do {
            let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice)
            captureSession.addInput(captureDeviceInput)
        } catch {
            print(error.localizedDescription)
        }

        if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
            self.previewLayer = previewLayer
            self.view.layer.addSublayer(self.previewLayer)
            self.previewLayer.frame = self.view.layer.frame
//ADD CONSTRAINTS HERE

            captureSession.startRunning()

            let dataOutput = AVCaptureVideoDataOutput()
            dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)]

            dataOutput.alwaysDiscardsLateVideoFrames = true

            if captureSession.canAddOutput(dataOutput) {
                captureSession.addOutput(dataOutput)
            }

            captureSession.commitConfiguration()

//            let queue = DispatchQueue(label: com.willkie.captureQueue)
//            dataOutput.setSampleBufferDelegate(self, queue: queue)
        }
    }

    func captureOutput(_ captureOutput: AVCaptureOutput!, didDrop sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
Run Code Online (Sandbox Code Playgroud)

为什么???

Kap*_*l G 7

我想可能会改变你的这条特定线路 -

self.previewLayer.frame = self.view.layer.frame 
Run Code Online (Sandbox Code Playgroud)

self.previewLayer.frame = self.view.layer.bounds
Run Code Online (Sandbox Code Playgroud)

此外,只有在上面的代码中调整了帧后,才应添加子图层.现在你已经添加了.

self.view.layer.addSublayer(self.previewLayer)
Run Code Online (Sandbox Code Playgroud)

而且你还需要增加引力

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
Run Code Online (Sandbox Code Playgroud)

如果它仍然无效,请将自定义视图添加到viewcontroller并将其设置为您要显示相机预览的大小,然后您可以使用此 -

self.previewLayer.frame = self.customViewOutlet.layer.bounds
Run Code Online (Sandbox Code Playgroud)

  • 这一行:`previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill`为我解决了这个问题。 (2认同)

Jul*_*Kro 5

我用Swift 4解决了这个问题:

不要忘记导入 AVKit

override func viewDidLoad() {
    super.viewDidLoad()

    let captureSession = AVCaptureSession()

    guard let captureDevice = AVCaptureDevice.default(for: .video),
        let input = try? AVCaptureDeviceInput(device: captureDevice) else {return}

    captureSession.addInput(input)
    captureSession.startRunning()

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

}
Run Code Online (Sandbox Code Playgroud)