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()
}
}
}
// 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
- swift3.0之后改变的语法 二维码定位
- Swift3.0 CoreData Fetch语法的一些改变
- swift3.0的改变
- Swift3中方法可变参数语法的一些改变
- Swift3中方法可变参数语法的一些改变
- Swift3.0 二维码扫描
- [iOS Swift3.0] 定位二维码+绘制定位框+简单使用UIBezierPath和CAShapeLayer
- Swift3.0中新的改变
- Swift3翻天覆地的改变
- swift3的改变
- Swift3.0教程(一)-基本的语法
- Swift3.0语法变化
- Swift3.0 语法总结
- swift3.0语法变化
- swift3.0 语法
- Swift3.0二维码扫描实现(写一个仿支付宝二维码扫描的效果)
- Swift3.1二维码的生成与扫描
- swift3.0下闭包语法汇总
- 上传图片
- Hibernate异常: Unable to get the default Bean Validation factory
- xyz:function(){....} 相当于function xyz()
- send和recv函数解析(转)
- 快速搭建自己的图片轮播
- swift3.0之后改变的语法 二维码定位
- Boost遍历以日期命名的文件夹
- new data 浏览性兼容性问题
- java List类型传递是值还是引用?如何传递值?
- winform简易聊天程序。。。。。学习笔记。。转载的
- 百度地图4.1_1开发教程(1)
- Android-PullToRefresh 自动刷新bug
- memcache 启动
- jsp九大内置对象、四种作用域、跳转方式