为预览图层设置边框会导致边框设置不正确
Setting the frame for the preview layer results in incorrect frame settings
我在使用 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)
您是否尝试过在 previewView
布置其子视图时调整 _previewLayer
的框架大小?
为您的 previewView
子类 UIView
,为您的 AVCaptureVideoPreviewLayer
设置 属性,并将其框架设置为与您的视图边界匹配:
class PreviewView: UIView {
let previewLayer: AVCaptureVideoPreviewLayer?
override func layoutSubviews() {
self.previewLayer?.frame = self.bounds;
}
}
我遇到了同样的问题。
我尝试了@rkyr 的建议(在viewDidLayoutSubviews
方法中设置框架),但没有成功。我也想在不添加子类的情况下修复它。
我能够通过 2 个更改修复它:
- 确保 previewLayer 被定义为 AVCaptureVideoPreviewLayer
(CALayer
的子类)而不是 CALayer
,这是我的情况
var previewLayer: AVCaptureVideoPreviewLayer? // :CALayer
确保图层的frame设置好,图层session的所有设置都设置好后添加到视图中:这段代码有效:
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
我在使用 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)
您是否尝试过在 previewView
布置其子视图时调整 _previewLayer
的框架大小?
为您的 previewView
子类 UIView
,为您的 AVCaptureVideoPreviewLayer
设置 属性,并将其框架设置为与您的视图边界匹配:
class PreviewView: UIView {
let previewLayer: AVCaptureVideoPreviewLayer?
override func layoutSubviews() {
self.previewLayer?.frame = self.bounds;
}
}
我遇到了同样的问题。
我尝试了@rkyr 的建议(在viewDidLayoutSubviews
方法中设置框架),但没有成功。我也想在不添加子类的情况下修复它。
我能够通过 2 个更改修复它:
- 确保 previewLayer 被定义为 AVCaptureVideoPreviewLayer
(CALayer
的子类)而不是 CALayer
,这是我的情况
var previewLayer: AVCaptureVideoPreviewLayer? // :CALayer
确保图层的frame设置好,图层session的所有设置都设置好后添加到视图中:这段代码有效:
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