// 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()
}
}
}
// 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()
}
}
}