iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)
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)的更多相关文章
- iOS - 原生的CIFilter生成二维码和条形码
使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码.系统CIFilter生成的二维码和条形码的大小有时并不能满足需求, ...
- iOS 原生实现生成二维码(CoreImage)工具类,不依赖第三方库,可自定义背景颜色,添加logo(Swift 4.0)
import Foundation import CoreImage import UIKit extension UIColor { var coreImageColor: CIColor { re ...
- java生成二维码并融合模板工具类
二维码融合模板 二维码融合图片 import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; i ...
- iOS使用AVFoundation实现二维码扫描(ios7以上)——转载
关于二维码扫描有不少优秀第三方库: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use ...
- iOS使用AVFoundation实现二维码扫描
原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...
- 【转】 iOS使用AVFoundation实现二维码扫描
原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...
- iOS开发——高级技术&生成二维码
生成二维码 因为项目里需要新增个功能,该功能用到了二维码技术.于是我便查阅了资料,先学习了二维码的生成. 我们使用libqrencode库来生成二维码.下载地址http://download.cs ...
- 使用Python的库qrcode生成二维码
现在有很多二维码的生成工具,在线的,或者安装的软件,都可以进行生成二维码.今天我用Python的qrcode库生成二维码.需要预先安装 Image 库 安装 用pip安装 # pip install ...
- PHP 使用GD库合成带二维码的海报步骤以及源码实现
PHP 使用GD库合成带二维码的海报步骤以及源码实现 在做微信项目开发过程中,经常会遇到图片合成的问题,比如将用户的二维码合成到宣传海报中,那么,遇到这种情况,利用PHP的GD库也是很容易实现的,实现 ...
随机推荐
- AVFoundation Programming Guide(官方文档翻译4)Editing - 编辑
新博客:完整版 - AVFoundation Programming Guide 分章节版:- 第1章:About AVFoundation - AVFoundation概述- 第2章:Using A ...
- 第二类Stirling数推导
- java中的URLEncoder和URLDecoder类;中文在地址栏中的处理
[IT168 技术文档] /* 网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a" ...
- fiddler 针对单个接口打断点
在命令行输入相关指令: 以慕课网为例: 请求前设置断点:bpu 实例: bpu https://www.imooc.com/index/getstarlist 请求 https://www.imooc ...
- phaser2->3:来个打地鼠试水
本文中phaser具体版本 phaser2:2.8.1 phaser3:3.17.0 一.实现效果二.实现细节三.项目总结四.参考文档 一.实现效果 源码地址(phaser2&phaser3) ...
- 读书笔记——《在线》
* 2017年10月24日 星期二 晴* ## "在线"是未来世界发展的关键.一个事物是不是符合未来发展的趋势,就是要看它是否在线. 插图 **在线** 正文 作者是王坚,阿里巴巴 ...
- yii框架通过控制台命令创建定时任务
假设Yii项目路径为 /home/apps 1. 创建文件 /home/apps/web/protected/commands/console.php $yii = '/home/apps/frame ...
- 事务Transaction
目录 为什么写这系列的文章 事务概念 ACID 并发事务导致的问题 脏读(Dirty Read) 非重复读(Nonrepeatable Read) 幻读(Phantom Reads) 丢失修改(Los ...
- redis BLPOP
一.需求 redis中保存了需要download的image url,存储格式为列表. 我需要从列表中获取数据,将图片下载保存到本地. 列表中的数据是一直增加的. 二.实现 使用redis BLPOP ...
- 基于layPage分页插件浅析两种分页方式
最近在开发过程中经常用到分页,今天挤出些时间来捋一捋自己的经验 在web开发中,一般显示数据列表页时,我们会用到分页控件来显示数据.采用分页一般基于两种不同的需求,一种是数据量不算很大,但是在页面展示 ...