【问题标题】:Setting the frame for the preview layer results in incorrect frame settings为预览图层设置框架会导致不正确的框架设置
【发布时间】:2016-01-31 00:28:53
【问题描述】:

我在使用 PBJVision 时遇到了一些问题。

我将它集成到一个 Swift 项目中,当我尝试设置预览层的框架时,它会导致框架不一致:

我有这个代码:

var _previewLayer: AVCaptureVideoPreviewLayer = PBJVision.sharedInstance().previewLayer
@IBOutlet weak var previewView: UIView! // this is the white view in the back

let bounds = self.previewView.layer.bounds
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
_previewLayer.bounds = bounds
_previewLayer.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
previewView.layer.addSublayer(_previewLayer)

【问题讨论】:

  • 你把这段代码放在哪里了?您是否使用自动布局构建界面?如果是这样,并且您在布局准备好之前使用此代码,您会在bounds 变量中得到错误的大小。你可以试着把它放在viewDidLayoutSubviews 方法中

标签: ios swift pbjvision


【解决方案1】:

previewView 布置其子视图时,您是否尝试过调整_previewLayer 的框架?

为您的previewView 子类UIView,为您的AVCaptureVideoPreviewLayer 设置一个属性,并将其框架设置为与您的视图边界相匹配:

class PreviewView: UIView {

    let previewLayer: AVCaptureVideoPreviewLayer?

    override func layoutSubviews() {
        self.previewLayer?.frame = self.bounds;
    }
}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    我尝试了@rkyr 推荐(在viewDidLayoutSubviews 方法中设置框架),但没有成功。我也想在不添加子类的情况下修复它。

    我能够通过 2 个更改来修复它: - 确保 previewLayer 被定义为 AVCaptureVideoPreviewLayerCALayer 的子类)而不是 CALayer,这是我的情况

    var previewLayer: AVCaptureVideoPreviewLayer? // :CALayer
    
    • 确保设置了图层的框架,并在设置了图层会话的所有设置后将其添加到视图中:此代码有效:

      captureSession = AVCaptureSession()
      let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
      do {
          let input = try AVCaptureDeviceInput(device: captureDevice!)
          captureSession?.addInput(input)
      } catch {
          onErrorCloseAndReturn(error: error)
      }
      let dataOutput = AVCaptureVideoDataOutput()
      dataOutput.videoSettings = [((kCVPixelBufferPixelFormatTypeKey as NSString) as String): NSNumber(value: kCVPixelFormatType_32BGRA)]
      dataOutput.alwaysDiscardsLateVideoFrames = true
      if captureSession!.canAddOutput(dataOutput) {
          captureSession?.addOutput(dataOutput)
      }
      captureSession?.commitConfiguration()
      let queue = DispatchQueue(label: "captureQueue")
      dataOutput.setSampleBufferDelegate(self, queue: queue)
      captureSession?.startRunning()
      
      previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
      previewLayer?.frame = self.view.layer.bounds
      self.view.layer.addSublayer(previewLayer!)
      

    我锄头有用... e

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2011-06-30
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多