为什么扫描一维条码只能在 Swift 的视图中间得到结果?

问题描述

我有一个关于扫描一维条码的问题。为什么我设置了扫描区域视图的黄色边框,只有我把它放在区域中间才能成功?

当我将我的一维条形码放入下图的绿色区域时,它工作正常。当我放置红色区域时,没有任何反应。我的应用方向只有左右。

我的代码有什么问题?

import UIKit
import AVFoundation

class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate,UIAlertViewDelegate {
    
    var scanRectView:UIView!
    var device:AVCaptureDevice!
    var input:AVCaptureDeviceInput!
    var output:AVCaptureMetadataOutput!
    var session:AVCaptureSession!
    var preview:AVCaptureVideoPreviewLayer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func viewDidLayoutSubviews() {
        self.configureVideoOrientation()
    }
    
    fileprivate func configureVideoOrientation() {
        
        let previewLayer = self.preview
        
        if let connection = previewLayer?.connection {
            
            let orientation = UIDevice.current.orientation
            
            if connection.isVideoOrientationSupported,let videoOrientation = AVCaptureVideoOrientation(rawValue: orientation.rawValue) {
                
                previewLayer?.frame = self.view.bounds
                connection.videoOrientation = videoOrientation
            }
        }
    }
    
    @IBAction func btnClicked(_ sender: Any) {
        
        do{
            self.device = AVCaptureDevice.default(for: AVMediaType.video)
            
            self.input = try AVCaptureDeviceInput(device: device)
            
            self.output = AVCaptureMetadataOutput()
            output.setMetadataObjectsDelegate(self,queue: dispatchQueue.main)
            
            self.session = AVCaptureSession()
            if UIScreen.main.bounds.size.height < 500 {
                self.session.sessionPreset = AVCaptureSession.Preset.vga640x480
            }else{
                self.session.sessionPreset = AVCaptureSession.Preset.high
            }
            
            self.session.addInput(self.input)
            self.session.addOutput(self.output)
            
            self.output.MetadataObjectTypes = [.qr,.ean8,.ean13,.pdf417,.code128,.aztec,.code39,.code39Mod43,.code93,.dataMatrix,.face,.interleaved2of5,.itf14,.upce]
            
            let windowSize = UIScreen.main.bounds.size
            let scanSize = CGSize(width:windowSize.width*1/3,height:windowSize.width*1/3)
            var scanRect = CGRect(x:(windowSize.width-scanSize.width)/2,y:(windowSize.height-scanSize.height)/2,width:scanSize.width,height:scanSize.height)
            
            scanRect = CGRect(x:scanRect.origin.y/windowSize.height,y:scanRect.origin.x/windowSize.width,width:scanRect.size.height/windowSize.height,height:scanRect.size.width/windowSize.width);
            self.output.rectOfInterest = scanRect
            
            self.preview = AVCaptureVideoPreviewLayer(session:self.session)
            self.preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
            self.preview.frame = UIScreen.main.bounds
            self.view.layer.insertSublayer(self.preview,at:0)
            
            self.scanRectView = UIView();
            self.view.addSubview(self.scanRectView)
            self.scanRectView.frame = CGRect(x:0,y:0,height:scanSize.height);
            self.scanRectView.center = CGPoint( x:UIScreen.main.bounds.midX,y:UIScreen.main.bounds.midY)
            self.scanRectView.layer.borderColor = UIColor.yellow.cgColor
            self.scanRectView.layer.borderWidth = 5;
            
            self.session.startRunning()
            
            do {
                try self.device!.lockForConfiguration()
            } catch _ {
                NSLog("Error: lockForConfiguration.");
            }
            self.device!.videoZoomFactor = 1.5
            self.device!.unlockForConfiguration()
            
        }catch _ {
            
        }
        
    }
    
    func MetadataOutput(_ output: AVCaptureMetadataOutput,didOutput MetadataObjects: [AVMetadataObject],from connection: AVCaptureConnection) {
        var stringValue:String?
        if MetadataObjects.count > 0 {
            let MetadataObject = MetadataObjects[0] as! AVMetadataMachineReadableCodeObject
            stringValue = MetadataObject.stringValue
            
            if stringValue != nil{
                self.session.stopRunning()
            }
        }
        self.session.stopRunning()
        
    }
    
}

img

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)