[iOS Swift3.0] 定位二维码+绘制定位框+简单使用UIBezierPath和CAShapeLayer

参考:放肆地使用UIBezierPath和CAShapeLayer画各种图形

1.获取摄像头拍摄数据

在AVCaptureMetadataOutputObjectsDelegate代理方法中处理

  func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
     //1获取扫描到的数据
        guard let obj = metadataObjects.last as? AVMetadataMachineReadableCodeObject
            else{
                return
        }
        //2 获取二维码位置
        //2.1 转换corners 坐标
        let objCorners = previewLayer.transformedMetadataObject(for: obj)
        //2.2 绘制图形绿框
        drawCorners(objCorners: objCorners as! AVMetadataMachineReadableCodeObject)
}

drawCorners(objCorners:AVMetadataMachineReadableCodeObject) 绘制方法实现

    /// 绘制绿色框(Bethel曲线)
    ///
    /// - parameter objCorners: 保存了坐标的 AVMetadataMachineReadableCodeObject 对象
    private func drawCorners(objCorners :AVMetadataMachineReadableCodeObject){
        if objCorners.corners.isEmpty{
            return
        }
        //1.新建layer
        let layer = CAShapeLayer()
        layer.lineWidth = 4
        layer.strokeColor = UIColor.green.cgColor
        layer.fillColor = UIColor.clear.cgColor

        //2.创建贝塞尔路径
        let path = UIBezierPath()
        var point = CGPoint.zero
        var index : Int = 0
        //2.1从corners数组中开始取point坐标
        point = CGPoint.init(dictionaryRepresentation: objCorners.corners[0] as! CFDictionary)!
        //2.2 移动到起始点
        path.move(to: point)
        while index < objCorners.corners.count{
            point = CGPoint.init(dictionaryRepresentation: objCorners.corners[index] as! CFDictionary)!
            index += 1
            //2.3 点添加成路径线
            path.addLine(to: point)
        }
        //2.4 关闭路径
        path.close()
        //2.5 绘制路径
        layer.path = path.cgPath
        //3.将创建好的layer添加到drawLayer上去
        drawlayer.addSublayer(layer)
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值