【问题标题】:AVCaptureVideoPreviewLayer isn't showing centre of previewAVCaptureVideoPreviewLayer 未显示预览中心
【发布时间】:2016-06-23 14:41:11
【问题描述】:

我正在尝试在我的应用中显示自定义摄像头视图的视频预览,但是目前预览非常偏离中心 - 在使用前置摄像头时尤其明显。

我是这样定位的:

if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
    previewLayer.bounds = scanningView.bounds
    previewLayer.position = CGPointMake(CGRectGetMidX(scanningView.bounds), CGRectGetMidY(scanningView.bounds))
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    scanningView.layer.insertSublayer(previewLayer, atIndex: 0)
}

但是预览的中心不在它所在视图的中心。我怎样才能做到这一点?

【问题讨论】:

  • 你在哪里写了这个初始化,我的意思是在viewDidLoad或其他地方?
  • 可以在 viewDidAppear 中试试吗?
  • 在 viewDidAppear 中很好,但初始化有点慢,所以我想我会在 viewdidload 中初始化它并添加到 viewDidAppear 中的视图
  • 在 viewDidLoad 中,自动布局还没有完成它的工作,所以你的 scanningView 没有它的最终位置和边界。我之前遇到过这个问题,找不到更好的位置来放置预览层,也许有人有更好的解决方案:)

标签: ios swift camera avcapturesession


【解决方案1】:

不确定是否需要 CGRectGetMidX/Y,只需放置给预览层一个与宿主视图相同的框架。

previewLayer.videoGravity = AVLayerVideoGravityResizeAspect
scanningView.layer.addSublayer(previewLayer)

另外,您使用自动布局吗?如果是这样,您可能需要在调用 viewWillLayoutSubviews 时调整框架

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    previewLayer.frame = scanningView.bounds
}

【讨论】:

    【解决方案2】:

    与其添加层和设置框架,不如使用自定义 UIView 并将其 subLayer 类分配给 AVCaptureVideoPreviewLayer。见例子below

    final class PreviewView: UIView {
    
      // 1
      override class var layerClass: AnyClass {
        return AVCaptureVideoPreviewLayer.self
          }
    .
    .
    

    我通过这种方式找到了解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 2019-10-29
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2019-09-28
      • 1970-01-01
      相关资源
      最近更新 更多