Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 设置预览层的帧会导致不正确的帧设置_Ios_Swift_Pbjvision - Fatal编程技术网

Ios 设置预览层的帧会导致不正确的帧设置

Ios 设置预览层的帧会导致不正确的帧设置,ios,swift,pbjvision,Ios,Swift,Pbjvision,我的PBJVision有点问题 我将其集成到Swift项目中,当我试图设置预览层的框架时,它会导致框架不一致: 我有以下代码: var _previewLayer: AVCaptureVideoPreviewLayer = PBJVision.sharedInstance().previewLayer @IBOutlet weak var previewView: UIView! // this is the white view in the back let bounds = self.

我的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)

预览视图
显示其子视图时,您是否尝试过调整
预览层
框架的大小

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

class PreviewView: UIView {

    let previewLayer: AVCaptureVideoPreviewLayer?

    override func layoutSubviews() {
        self.previewLayer?.frame = self.bounds;
    }
}
我也有同样的问题

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

我可以通过两个更改来修复它: -确保previewLayer定义为
AVCaptureVideoPreviewLayer
CALayer
的子类),而不是
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

您将此代码放在哪里?您是否使用自动布局构建界面?如果是这样,并且在布局准备就绪之前使用此代码,则在
bounds
变量中得到错误的大小。您可以尝试将其放入
viewdilayoutsubviews
方法中