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. response 画验证码

    代码 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.Bu ...

  2. 推拿O2O 想说爱你还不容易

    想说爱你还不容易" title="推拿O2O 想说爱你还不容易"> <屌丝男士>第四季最后一集里,乔杉终于圆了"大保健"的梦想,可惜 ...

  3. mingster.com

    Good to Great: Why Some Companies Make the Leap... and Others Don'tby Jim Collinshttp://rcm.amazon.c ...

  4. Simpo

    Time: 2017-01-16 - Download Github: https://github.com/KeliCheng/Simpo一款快速发布文字和图片到社交网站的macOS菜单栏App,目 ...

  5. jquery.qrcode笔记

    由于一个坑爹的项目需要生成二维码扫描,后台由于数据库比较麻烦,就只能前端做了,于是乎找到Js生成qrcode的一个库:https://github.com/jeromeetienne/jquery-q ...

  6. 7-41 jmu-python-最佳身高 (10 分)

    最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高).下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高. 输入格式: 输入第一行给出正整数N(≤10),为前来查询的用 ...

  7. 关于IT培训机构的个人看法

    1.前言 缘分与巧合,最近接触比较多的培训机构出来的人,以及看过关于培训机构的文章和问答.虽然没在培训机构上过课,但是接触过很多培训机构出来的人,也看过一些培训机构的课程.关于培训机构,我也有自己的看 ...

  8. 前端、HTML+CSS+JS编写规范(终极版)

    HTMLCSS文档规范 HTML和CSS文档必须采用UTF-8编码格式: HTML文档必须使用HTML5的标准文档格式: HTMLCSS编写规范 HTML和CSS的标签.属性.类名.ID都必须使用小写 ...

  9. 前端每日实战:114# 视频演示如何用纯 CSS 和混色模式创作一个 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqYroW 可交互视频 此视频是可 ...

  10. npm注册源的配置

    npm注册源的更换 在墙内久了,难免会碰到撞墙的时候,所幸国内也有众多 NPM 镜像可供选择,在大多数情况下我们可以使用国内的源(比如 淘宝 NPM 镜像)去替换官方的源以加快下载包的速度.不过呢,我 ...