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

来源:互联网 发布:饮食养生的软件 编辑:程序博客网 时间:2024/05/22 03:44
//    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()
        }
    }
}

1 0
原创粉丝点击