swift 扫描二维码/条形码,开启闪光灯,识别相册二维码
来源:互联网 发布:b2b商城app源码 编辑:程序博客网 时间:2024/06/05 15:19
demo下载地址
https://github.com/liwei5bao/QRCodeProject
import UIKit
import AudioToolbox
import AVFoundation
class QRCodeViewController:UIViewController,AVCaptureMetadataOutputObjectsDelegate {
///扫描容器的高度
@IBOutletweakvar scanViewHeight:NSLayoutConstraint!
///扫描线的顶部约束
@IBOutletweakvar qrcodeLineTop:NSLayoutConstraint!
///扫描线的高度
let scanLineH:CGFloat =5
///动画的timer
var timer:NSTimer?
var runloop:NSRunLoop?
///相册图片
var photoLibraryImage:UIImage?
overridefunc viewDidLoad() {
super.viewDidLoad()
let scheduledTime =NSDate(timeIntervalSinceNow: 0)
self.timer =NSTimer(fireDate: scheduledTime, interval:3.0, target: self, selector:"startAnimation", userInfo: nil, repeats:true)
runloop = NSRunLoop.currentRunLoop()
runloop!.addTimer(self.timer!, forMode:NSDefaultRunLoopMode)
// 2.开始扫描
startScan()
}
overridefunc viewWillAppear(animated:Bool) {
super.viewWillAppear(animated)
session.startRunning()
}
overridefunc viewWillDisappear(animated:Bool) {
super.viewDidDisappear(animated)
//停止扫描
session.stopRunning()
}
//MARK:返回
@IBActionfunc backBtnclick(sender:UIButton) {
self.navigationController?.popViewControllerAnimated(true)
}
//MARK:开灯
@IBActionfunc QRCodeLightBtnClick(sender:UIButton) {
let isLightOpened =self.isLightOpened()
//可以用来调整开灯关灯的按钮状态
// if isLightOpened{//开灯
//
// }else{//关灯
//
// }
self.openLight(!isLightOpened)
}
//MARK:图片
@IBActionfunc QRCodePhotosBtnClick(sender:UIButton) {
self.openPhotoLibrary()
}
/**
执行动画
*/
func startAnimation()
{
// 让约束从顶部开始
self.qrcodeLineTop.constant =0
self.view.layoutIfNeeded()
//
weakvar weakSelf =self
UIView.animateWithDuration(3.0, animations: { () ->Voidin
// 1.修改约束
self.qrcodeLineTop.constant = weakSelf!.scanViewHeight.constant - weakSelf!.scanLineH
// 设置动画指定的次数
// UIView.setAnimationRepeatCount(MAXFLOAT)
// 2.强制更新界面
weakSelf!.view.layoutIfNeeded()
})
}
// MARK: - 懒加载
// 会话
lazyvar session :AVCaptureSession =AVCaptureSession()
// 拿到输入设备
privatelazyvar deviceInput:AVCaptureDeviceInput? = {
// 获取摄像头
let device =AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
do{
//创建输入对象
let input =tryAVCaptureDeviceInput(device: device)
return input
}catch
{
print(error)
returnnil
}
}()
// 拿到输出对象
privatelazyvar output:AVCaptureMetadataOutput = AVCaptureMetadataOutput()
// 创建预览图层
privatelazyvar previewLayer:AVCaptureVideoPreviewLayer = {
let layer =AVCaptureVideoPreviewLayer(session:self.session)
layer.frame =UIScreen.mainScreen().bounds
return layer
}()
//创建用于绘制边线的图层
privatelazyvar drawLayer:CALayer = {
let layer =CALayer()
layer.frame =UIScreen.mainScreen().bounds
return layer
}()
}
//MARK:--打开闪光灯的方法
extension QRCodeViewController{
///判断闪光灯是否打开
privatefunc isLightOpened()->Bool{
let device =AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if !device.hasTorch{
returnfalse
}else{
if device.torchMode ==AVCaptureTorchMode.On{//闪光灯已经打开
returntrue
}else{
returnfalse
}
}
}
///打开闪光灯的方法
privatefunc openLight(open:Bool){
let device =AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if !device.hasTorch{
UIAlertView(title:"提示", message:"闪光灯故障", delegate:nil, cancelButtonTitle: "确定").show()
}else{
if open{//打开
if device.torchMode !=AVCaptureTorchMode.On || device.flashMode !=AVCaptureFlashMode.On{
do{
try device.lockForConfiguration()
device.torchMode =AVCaptureTorchMode.On
device.flashMode =AVCaptureFlashMode.On
device.unlockForConfiguration()
}catch
{
print(error)
}
}
}else{//关闭闪光灯
if device.torchMode !=AVCaptureTorchMode.Off || device.flashMode !=AVCaptureFlashMode.Off{
do{
try device.lockForConfiguration()
device.torchMode =AVCaptureTorchMode.Off
device.flashMode =AVCaptureFlashMode.Off
device.unlockForConfiguration()
}catch
{
print(error)
}
}
}
}
}
///
}
//MARK:扫描二维码的方法和代理
extension QRCodeViewController:UIAlertViewDelegate{
/**
扫描二维码
*/
privatefunc startScan(){
// 1.判断是否能够将输入添加到会话中
if !session.canAddInput(deviceInput)
{
return
}
// 2.判断是否能够将输出添加到会话中
if !session.canAddOutput(output)
{
return
}
// 3.将输入和输出都添加到会话中
session.addInput(deviceInput)
session.addOutput(output)
// 4.设置输出能够解析的数据类型
output.metadataObjectTypes = output.availableMetadataObjectTypes
print(output.availableMetadataObjectTypes)
// 5.设置输出对象的代理,只要解析成功就会通知代理
output.setMetadataObjectsDelegate(self, queue:dispatch_get_main_queue())
// 添加预览图层
view.layer.insertSublayer(previewLayer, atIndex:0)
//添加绘制图层到预览图层上
previewLayer.addSublayer(drawLayer)
// 6.告诉session开始扫描
session.startRunning()
}
//只要解析到数据就会调用
func captureOutput(captureOutput:AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection:AVCaptureConnection!)
{
// 1.获取扫描到的数据
// 注意: 要使用stringValue
let result = metadataObjects.last?.stringValue
if result !=nil{
UIAlertView(title:"提示", message:"扫描结果为:\(result!)", delegate:self, cancelButtonTitle: "确定").show()
session.stopRunning()
}
}
//MARK: UIAlertViewDelegate 代理方法
func alertView(alertView:UIAlertView, clickedButtonAtIndex buttonIndex:Int) {
session.startRunning()
}
}
//MARK:--访问相册和从相册解析二维码的方法
extension QRCodeViewController:UIImagePickerControllerDelegate,UINavigationControllerDelegate{
///打开相册的方法
privatefunc openPhotoLibrary() {
let picker =UIImagePickerController()
picker.sourceType =UIImagePickerControllerSourceType.PhotoLibrary
picker.delegate =self
picker.allowsEditing =true
self.presentViewController(picker, animated:true, completion:nil)
}
func imagePickerController(picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String :AnyObject]) {
let type = (infoasNSDictionary).objectForKey(UIImagePickerControllerMediaType)as!String
session.stopRunning()
if type =="public.image"
{
let image = (infoasNSDictionary).objectForKey(UIImagePickerControllerOriginalImage)as!UIImage
self.photoLibraryImage = image
//识别二维码的方法
let result = image.decodeQRImageWith(image)
//跳转的方法
if result !=nil{
UIAlertView(title:"提示", message:"扫描结果为:\(result!)", delegate:self, cancelButtonTitle: "确定").show()
}else{
UIAlertView(title:"提示", message:"不能识别的类型", delegate:self, cancelButtonTitle: "确定").show()
}
}
self.dismissViewControllerAnimated(true) { () -> Void in}
}
}
- swift 扫描二维码/条形码,开启闪光灯,识别相册二维码
- QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
- 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
- Android之扫描二维码&开启闪光灯
- android 二维码,条形码生成与扫描识别
- iOS 自定义二维码条形码扫描识别
- android二维码、条形码生成与扫描识别
- 二维码实现开启闪光灯
- 条形码,二维码扫描
- 条形码,二维码扫描
- iOS 二维码,条形码扫描
- android 二维码 条形码扫描
- IOS扫描二维码条形码
- 条形码,二维码扫描
- 条形码、二维码扫描
- ios 二维码、条形码扫描
- 二维码、条形码的扫描
- Android二维码扫描+开闪光灯
- 如何在Windows访问VMware里面的应用
- 关于Excel表格的导出方式一
- java.util.Stack类简介
- HDU 2027 统计元音(gets+水题)
- Oracle 进程详解
- swift 扫描二维码/条形码,开启闪光灯,识别相册二维码
- ORACLE数据库表被锁的查询语句与解锁方法
- 【BootStrap】陌生=》熟悉=》惊喜
- 集合划分问题(斯特林数模板)
- In-App Purchase(iap)快速指南
- windows server开放对外端口
- 博客转移到github上了,csdn的博客就关了。
- 成功解决未能为 Visual Studio 创建 Application Data 文件夹
- Android 编程下 Touch 事件的分发和消费机制