Create QRScanner.swift file

//
// QRScanner.swift
// NativeQR
//
// Created by Harvey on 2017/10/24.
// Copyright © 2017年 Harvey. All rights reserved.
// import Foundation
import AVFoundation
import UIKit class QRScanner: NSObject { static let shared = QRScanner() private let captureSession = AVCaptureSession()
private let videoPreviewLayer = AVCaptureVideoPreviewLayer() private var handleCompleted: ((String) -> ())? = nil private override init() { super.init() AVCaptureDevice.requestAccess(for: AVMediaType.video) { (isSuccess) in if isSuccess { self.prepare()
}else { print("无权访问摄像机")
}
}
} private func prepare() { guard let device = AVCaptureDevice.default(for: .video) else { print("获取摄像设备发生错误")
return
} guard let deviceInput = try? AVCaptureDeviceInput(device: device) else { print("创建设备输入流发生错误")
return
} // 创建数据输出流
let metadataOutput = AVCaptureMetadataOutput()
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) // 创建设备输出流
let videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput.setSampleBufferDelegate(self, queue: DispatchQueue.main) // 会话采集率: AVCaptureSessionPresetHigh
captureSession.sessionPreset = .high // 添加数据输出流到会话对象
captureSession.addOutput(metadataOutput) // 添加设备输出流到会话对象
captureSession.addOutput(videoDataOutput) // 添加设备输入流到会话对象
captureSession.addInput(deviceInput) // 设置数据输出类型
metadataOutput.metadataObjectTypes = [
.qr, // 二维码
.ean13, // 条形码
.ean8, // 条形码
.code128 // 条形码
] videoPreviewLayer.session = captureSession
videoPreviewLayer.videoGravity = .resizeAspectFill
} func scan(design: @escaping (_ previewLayer: CALayer)->()) -> Self { design(videoPreviewLayer) startRunning() return self
} func completed(aCompleted: @escaping (_ value: String)->()) { self.handleCompleted = aCompleted
} func startRunning() { captureSession.startRunning()
} func stopRunning() { captureSession.stopRunning()
}
} extension QRScanner: AVCaptureMetadataOutputObjectsDelegate { func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { guard metadataObjects.count>0 else{ return
} stopRunning() guard let stringValue = metadataObjects.first!.value(forKey: "stringValue") as? String else { return
} handleCompleted?(stringValue)
}
} extension QRScanner: AVCaptureVideoDataOutputSampleBufferDelegate { func captureOutput(_ output: AVCaptureOutput, didDrop sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { }
}

使用示例

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) QRScanner.shared
.scan { (previewLayer) in /// 设置preview的frame
let width = UIScreen.main.bounds.size.width - 100
previewLayer.frame = CGRect(x: 50, y: 100, width: width, height: width)
self.view.layer.insertSublayer(previewLayer, at: 0) // 你的扫描动画代码
// ......
// ......
}
.completed { (qrValue) in // 处理二维码 print(qrValue) // 结束你的扫描动画代码
// ......
// ......
}
}

代码及示例下载(有实现生成二维码)

前往

iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)的更多相关文章

  1. iOS - 原生的CIFilter生成二维码和条形码

    使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码.系统CIFilter生成的二维码和条形码的大小有时并不能满足需求, ...

  2. iOS 原生实现生成二维码(CoreImage)工具类,不依赖第三方库,可自定义背景颜色,添加logo(Swift 4.0)

    import Foundation import CoreImage import UIKit extension UIColor { var coreImageColor: CIColor { re ...

  3. java生成二维码并融合模板工具类

    二维码融合模板 二维码融合图片 import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; i ...

  4. iOS使用AVFoundation实现二维码扫描(ios7以上)——转载

    关于二维码扫描有不少优秀第三方库: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use ...

  5. iOS使用AVFoundation实现二维码扫描

    原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...

  6. 【转】 iOS使用AVFoundation实现二维码扫描

    原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...

  7. iOS开发——高级技术&生成二维码

      生成二维码 因为项目里需要新增个功能,该功能用到了二维码技术.于是我便查阅了资料,先学习了二维码的生成. 我们使用libqrencode库来生成二维码.下载地址http://download.cs ...

  8. 使用Python的库qrcode生成二维码

    现在有很多二维码的生成工具,在线的,或者安装的软件,都可以进行生成二维码.今天我用Python的qrcode库生成二维码.需要预先安装  Image 库 安装 用pip安装 # pip install ...

  9. PHP 使用GD库合成带二维码的海报步骤以及源码实现

    PHP 使用GD库合成带二维码的海报步骤以及源码实现 在做微信项目开发过程中,经常会遇到图片合成的问题,比如将用户的二维码合成到宣传海报中,那么,遇到这种情况,利用PHP的GD库也是很容易实现的,实现 ...

随机推荐

  1. (四)mybatis缓存、事务、插件的基本知识

    mybatis缓存.事务.插件的基础 一.缓存 (一)一级缓存与二级缓存 一级缓存 为了获得更好的性能,最重要的就是一级缓存.每个session对象维持一个一级缓存,session对象创建时缓存创建, ...

  2. Algorithms第3章及少量习题

    第三章的主要思想就是DFS.讲了图上的DFS操作,然后讲了各种应用.这章默认图都是用邻接矩阵存的. procedure explore(G, v) Input: G = (V, E) is a gra ...

  3. Django学习之路04

    视图层 小白必会三板斧 HttpResponse render redirect django视图函数必须要给返回一个HttpResponse对象(render和redirect内部返回的也是一个Ht ...

  4. springboot 不同类型多数据源配置及使用

    springboot多数据源配置: datasource.master.jdbc=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...

  5. failed to load main-class manifest attribute(运行jar包出错)

    原因描述:MANIFEST.MF文件中的Main-Class配置不正确或格式不正确 检查方式:以WinRarR的方式打开jar包,如图所示, 点击进入箭头所指的META-INF文件夹     将MAN ...

  6. lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问

    lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问,如果关闭防火墙虚拟IP就可以访问网站了,这个问题肯定是防火墙在作怪. 经过这两的不懈奋斗和大家的帮助 ...

  7. C++走向远洋——65(十五周、项目一)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  8. python爬虫-smtplib模块发送邮件

    1.代码如下: import smtplib from email.message from EmailMessage # smtplib模块负责发送邮件服务 # email.message模块负责构 ...

  9. git指令-工作区和暂存区

    #git指令-工作区和暂存区 工作区(Working Directory):就是平常电脑可以看到的文件夹目录 版本库(Repository):存放git内容的文件夹例如: Git的版本库里存了很多东西 ...

  10. htmlhint 规则详解

    HTML 静态检查规则 HTMLHint 工具内置 23 条规则,可以对 HTML 代码文件进行静态代码检查,从而提高 HTML 代码编写的规范和质量.现在把 23 条规则翻译如下. 一.规则列表 标 ...