AVCaptureVideoPreviewLayer 看起来是 iPhone 4 大小

AVCaptureVideoPreviewLayer looks to be iPhone 4 size

我正在使用此代码在我的 iOS 9,Swift 应用程序中显示摄像头:

属性:

@IBOutlet weak var previewView: UIView!

var session: AVCaptureSession!
var input: AVCaptureDeviceInput!
var output: AVCaptureStillImageOutput!
var previewLayer: AVCaptureVideoPreviewLayer?

委托方法:

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

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    setupSession()
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    // Experimental / debugging
    view.layoutSubviews()
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // Experimental / debugging
    previewLayer!.frame = previewView.bounds
}

相机方法:

func setupSession() {
    session = AVCaptureSession()
    session.sessionPreset = AVCaptureSessionPresetPhoto

    let camera = frontCamera()

    do { input = try AVCaptureDeviceInput(device: camera) } catch { return }

    output = AVCaptureStillImageOutput()
    output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]

    guard session.canAddInput(input) && session.canAddOutput(output) else { return }

    session.addInput(input)
    session.addOutput(output)

    previewLayer = AVCaptureVideoPreviewLayer(session: session)
    previewLayer!.videoGravity = AVLayerVideoGravityResizeAspect
    previewLayer!.frame = previewView.bounds
    previewLayer!.connection?.videoOrientation = .Portrait

    previewView.layer.addSublayer(previewLayer!)

    session.startRunning()
}

func frontCamera() -> AVCaptureDevice! {
    let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
    for device in devices {
        if (device.position == AVCaptureDevicePosition.Front) {
            return device as! AVCaptureDevice
        }
    }
    return nil
}

但是,相机显示是这样的:

它似乎相当于 iPhone 4.

的显示大小

我该如何解决这个问题?我已经尝试在 viewDidLayoutSubviews 中设置框架,但我无法正确调整它的大小。

检查您是否为所有支持的设备分配了启动图像。如果不是,那么 iOS 将默认为该大小,无论您做什么。

您不必重写 layoutSubivews 或 viewDidLayoutSUbviews 方法。

  1. 确保 previewView 被限制为 superview(如果您使用的是自动版式)
  2. 确保 previewLayer 的边界与 previewView bounds 相同。不要在将帧值赋予边界或将绑定值赋予框架时感到困惑。
  3. 设置预览图层的视频重力为AVLayerVideoGravityResizeAspectFill

4.You 可以定位 previewLayer 并使其居中于 previewView 。使用 previewLayer 的位置 属性 并将其设置为 previewView.

的中心
  1. viewDidAppear/viewWillAppear
  2. 中调用 setupSession()