如何使相机背景比Swift 5中的rectOfInterest更暗,XCode 11

问题描述 投票:0回答:1

我正在寻找一个条形码扫描仪应用程序。由于我是Swift和Xcode的新手,所以我设法从其他stackoverflow文章(thisthis one)获得帮助,以创建一个页面,我可以在rectOfInterestArea(带角)中扫描条形码,而不是全视角相机。但是我很难使除rectOfInterestArea以外的其他区域变暗。我的整个区域越来越黑。不知道我在做什么错。结果是:

我基本上是想实现类似的东西

<< [

下面是我的代码

import AVFoundation import UIKit class TestViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { var captureSession: AVCaptureSession! var previewLayer: AVCaptureVideoPreviewLayer! var rectOfInterestArea = UIView() var darkView = UIView() var scanRect:CGRect = CGRect(x: 0, y: 0, width: 0, height: 0) let metadataOutput = AVCaptureMetadataOutput() override func viewDidLoad() { super.viewDidLoad() captureSession = AVCaptureSession() guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return } let videoInput: AVCaptureDeviceInput do { videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) } catch { return } if (captureSession.canAddInput(videoInput)) { captureSession.addInput(videoInput) } else { failed() return } if (captureSession.canAddOutput(metadataOutput)) { captureSession.addOutput(metadataOutput) metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) metadataOutput.metadataObjectTypes = [.qr] } else { failed() return } let size = 300 let screenWidth = self.view.frame.size.width let xPos = (CGFloat(screenWidth) / CGFloat(2)) - (CGFloat(size) / CGFloat(2)) scanRect = CGRect(x: Int(xPos), y: 150, width: size, height: size) rectOfInterestArea.frame = scanRect view.addSubview(rectOfInterestArea) print(rectOfInterestArea.frame.size.height, " ", rectOfInterestArea.frame.size.width ) previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) previewLayer.frame = view.layer.bounds previewLayer.videoGravity = .resizeAspectFill view.layer.addSublayer(previewLayer) print(previewLayer.frame.size.height, " ", previewLayer.frame.size.width ) view.addSubview(rectOfInterestArea) captureSession.startRunning() metadataOutput.rectOfInterest = previewLayer.metadataOutputRectConverted(fromLayerRect: scanRect) } func failed() { let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) present(ac, animated: true) captureSession = nil } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.rectOfInterestArea.layer.addSublayer(self.createFrame()) if (captureSession?.isRunning == false) { captureSession.startRunning() } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if (captureSession?.isRunning == true) { captureSession.stopRunning() } } func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { captureSession.stopRunning() if let metadataObject = metadataObjects.first { guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return } guard let stringValue = readableObject.stringValue else { return } found(code: stringValue) } dismiss(animated: true) } func found(code: String) { print(code) } override var prefersStatusBarHidden: Bool { return true } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait } func createFrame() -> CAShapeLayer { let height: CGFloat = self.rectOfInterestArea.frame.size.height let width: CGFloat = self.rectOfInterestArea.frame.size.width print(height, " " , width) //let h = previewLayer.frame.size.height let path = UIBezierPath() path.move(to: CGPoint(x: 5, y: 50)) path.addLine(to: CGPoint(x: 5, y: 5)) path.addLine(to: CGPoint(x: 50, y: 5)) path.move(to: CGPoint(x: height - 55, y: 5)) path.addLine(to: CGPoint(x: height - 5, y: 5)) path.addLine(to: CGPoint(x: height - 5, y: 55)) path.move(to: CGPoint(x: 5, y: width - 55)) path.addLine(to: CGPoint(x: 5, y: width - 5)) path.addLine(to: CGPoint(x: 55, y: width - 5)) path.move(to: CGPoint(x: width - 55, y: height - 5)) path.addLine(to: CGPoint(x: width - 5, y: height - 5)) path.addLine(to: CGPoint(x: width - 5, y: height - 55)) let shape = CAShapeLayer() shape.path = path.cgPath shape.strokeColor = UIColor.white.cgColor shape.lineWidth = 5 shape.fillColor = UIColor.clear.cgColor return shape } }

感谢您的任何帮助!

我正在寻找一个条形码扫描仪应用程序。由于我是Swift和Xcode的新手,所以我设法从其他stackoverflow文章(本文)中获得帮助,以创建可以扫描条形码的页面...

barcode-scanner swift5 xcode11 camera-overlay
1个回答
0
投票
let path = CGMutablePath() path.addRect(bounds) path.addRect(rectOfInterest) let maskLayer = CAShapeLayer() maskLayer.path = path maskLayer.fillColor = UIColor.black.withAlphaComponent(0.6).cgColor maskLayer.fillRule = .evenOdd addSublayer(maskLayer)
© www.soinside.com 2019 - 2024. All rights reserved.