swift3.0之后改变的语法 二维码定位

本文介绍了一个使用Swift语言实现的二维码扫描功能,详细展示了如何通过AVFoundation框架捕获并解析摄像头中的二维码数据,并在屏幕上绘制二维码边界。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//    private: 私有属性和方法,仅在当前类中可以访问,不包括分类;
//    fileprivate: 文件内私有属性和方法,仅在当前文件中可以访问,包括同一个文件中不同的类。
    //创建预览视图
  fileprivate  lazy var previewLayer : AVCaptureVideoPreviewLayer = {
            let layer = AVCaptureVideoPreviewLayer(session: self.session)
            layer?.frame = UIScreen.main.bounds
            return layer!
    }()
   fileprivate  lazy var drawLayer: CALayer = {
        let layer = CALayer()
        layer.frame = UIScreen.main.bounds
        return layer
    }()
    
 
}

extension QRCodeViewController: AVCaptureMetadataOutputObjectsDelegate{
    //只要解析到数据就会调用
    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
        clearConers()   
        //2.获取二维码的位置
        for object in metadataObjects{
            if object is AVMetadataMachineReadableCodeObject{
                
       let codeObject = previewLayer.transformedMetadataObject(for: object as! AVMetadataObject) as! AVMetadataMachineReadableCodeObject
          drawCorners(codeObject:codeObject)
            }
        }
    }
    private func drawCorners(codeObject: AVMetadataMachineReadableCodeObject){
       if codeObject.corners.isEmpty{
            return
        }
    //1.创建一个图层
    let layer = CAShapeLayer()
        layer.lineWidth = 4
        layer.strokeColor = UIColor.red.cgColor
        layer.fillColor = UIColor.clear.cgColor

        let path = UIBezierPath()
        var point = CGPoint.zero
        var index: Int = 0

        //        将字典转换为点
//      CGPointMakeWithDictionaryRepresentation((codeObject.corners[index++] as! CFDictionaryRef), &point)这个方法在swift3.0之后没有找到 so,用下面的方法代替
        point.x = (codeObject.corners[index] as! Dictionary)["X"]!
        point.y = (codeObject.corners[index] as! Dictionary)["Y"]!
        path.move(to: point)
        
        index += 1
        while index < codeObject.corners.count{
            point.x = (codeObject.corners[index] as! Dictionary)["X"]!
            point.y = (codeObject.corners[index] as! Dictionary)["Y"]!
            index += 1
            path.addLine(to: point)
        }

        path.close()
        layer.path = path.cgPath
        drawLayer.addSublayer(layer)
    }
    private func clearConers(){
        if drawLayer.sublayers == nil || drawLayer.sublayers?.count == 0{
            return
        }
        for subLayer in drawLayer.sublayers! {
            subLayer.removeFromSuperlayer()
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值