参考:放肆地使用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)
}