IOS 扫二维码
来源:互联网 发布:淘宝网货到付款商城 编辑:程序博客网 时间:2024/04/27 03:30
原创Blog,转载请注明出处
blog.csdn.net/hello_hwc
注意:本篇文章采用了IOS7的新特性来扫二维码,所以系统支持要IOS7以上,如果要兼容IOS7之前的版本,自行找库来支持。
为了方便,我把扫二维码简单封装到了一个UIView中,用代理的方式返回值
在使用之前,应当为工程添加AVFoundation.framework
最后实现的效果如图
完整的实现代码
头文件
//// HwcScanQRView.h// HwcAnimationExample//// Created by huangwenchen on 15/1/7.// Copyright (c) 2015年 huangwenchen. All rights reserved.//#import <UIKit/UIKit.h>@protocol HwcScanQRDelegate <NSObject>/*!* @discussion Delegate method when scan QR successed* @param QRContent Scan result* @return Void*/-(void)DidGetScanWithResult:(NSString *)QRContent;/*! * @discussion Delegate method when scan QR failed * @param error Error message * @return Void */-(void)DidFailToScanWithError:(NSError *)error;@end@interface HwcScanQRView : UIView@property id<HwcScanQRDelegate> delegate;@property(nonatomic,readonly) bool isScaning;-(BOOL)startScaning;-(void)stop;@end.m文件
//// HwcScanQRView.m// HwcAnimationExample//// Created by huangwenchen on 15/1/7.// Copyright (c) 2015年 huangwenchen. All rights reserved.//#import "HwcScanQRView.h"#import <AVFoundation/AVFoundation.h>@interface HwcScanQRView()<AVCaptureMetadataOutputObjectsDelegate>@property(nonatomic,readwrite) bool isScaning;@property(strong,nonatomic)AVCaptureSession * captureSession;@property(strong,nonatomic)AVCaptureVideoPreviewLayer * vedioPreviewLayer;@end@implementation HwcScanQRView#pragma mark - Propertys-(AVCaptureSession *)captureSession{ if (!_captureSession) { _captureSession = [[AVCaptureSession alloc] init]; } return _captureSession;}-(AVCaptureVideoPreviewLayer *)vedioPreviewLayer{ if (!_vedioPreviewLayer) { _vedioPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession]; } return _vedioPreviewLayer;}#pragma mark - QRScan function-(BOOL)startScaning{ NSError * error; AVCaptureDevice * captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput * deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; if (!deviceInput) { if ([self.delegate respondsToSelector:@selector(DidFailToScanWithError:)]) { [self.delegate DidFailToScanWithError:error]; } return NO; } [self.captureSession addInput:deviceInput]; AVCaptureMetadataOutput * captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; [self.captureSession addOutput:captureMetadataOutput]; dispatch_queue_t scanQRqueue; scanQRqueue = dispatch_queue_create("scanQRqueue",DISPATCH_QUEUE_SERIAL); [captureMetadataOutput setMetadataObjectsDelegate:self queue:scanQRqueue]; [captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; [self.vedioPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; [self.vedioPreviewLayer setFrame:self.layer.bounds]; [self.layer addSublayer:self.vedioPreviewLayer]; [self.captureSession startRunning]; return YES;}-(void)stop{ [self.captureSession stopRunning]; self.isScaning = NO; self.captureSession = nil; [_vedioPreviewLayer removeFromSuperlayer];}#pragma mark - AVFoundation delegate method-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects != nil && metadataObjects.count > 0) { AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects firstObject]; if ([[metadataObject type] isEqualToString:AVMetadataObjectTypeQRCode]) { NSString * scanResult = [metadataObject stringValue]; dispatch_async(dispatch_get_main_queue(), ^{ if ([self.delegate respondsToSelector:@selector(DidGetScanWithResult:)]) { [self.delegate DidGetScanWithResult:scanResult]; } }); } }}@end
在使用的类中
//// ViewController.m// HwcAnimationExample//// Created by huangwenchen on 15/1/6.// Copyright (c) 2015年 huangwenchen. All rights reserved.//#import "ViewController.h"#import "HwcScanQRView.h"@interface ViewController ()<HwcScanQRDelegate>//这里实现代理@property (strong,nonatomic)UILabel * scanresultLabel;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; HwcScanQRView * scanView = [[HwcScanQRView alloc] initWithFrame:CGRectMake(100,100,200, 200)]; scanView.delegate = self;//这一步必须的 [self.view addSubview:scanView]; self.scanresultLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 320, 200, 30)]; [self.view addSubview:self.scanresultLabel]; [scanView startScaning];//不要忘记开始扫描}//两个代理方法-(void)DidGetScanWithResult:(NSString *)QRContent{ self.scanresultLabel.text = QRContent;}-(void)DidFailToScanWithError:(NSError *)error{ NSLog(@"%@",error.localizedDescription);}@end
3 0
- ios 二维码扫瞄
- IOS 扫二维码
- IOS 二维码扫码
- IOS生成二维码、扫二维码
- ios 二维码生成 扫瞄
- [iOS]扫码+生成二维码
- iOS二维码生成及扫码
- iOS二维码生成及扫码
- ios ZBar扫二维码奇奇怪怪的错误
- iOS 原生二维码的扫面功能
- iOS AV Foundation 二维码扫描 02 扫码
- IOS实现原生二维码扫码(swift版)
- iOS开发——扫二维码下载APP
- iOS 原生二维码[扫码]与[生成]详解
- iOS 二维码扫面 相册图片二维码读取和二维码的生成
- iOS原生二维码扫码实现(含蒙版和扫码动画)
- 扫码二维码
- 二维码扫名片
- 和丁丁聊天总结
- 学Ubuntu必看序列,本贴定期更新。注|更新标题不再显示其日期
- 浅谈三层之登录窗体(C#)
- 面向对象(上)-2
- awk编程范例,输出cpu简要信息
- IOS 扫二维码
- cv::Mat 的子矩阵赋值
- 【BZOJ1061】【NOI2008】志愿者招募 费用流神题、单纯形裸题(代码费用流)
- java 线程和线程池对比
- LESS CSS 框架简介
- 万年历
- 抽屉-YRSideViewController的使用
- spring quartz:Instantiation of bean failed; nested exception is java.lang.IncompatibleClassChangeErr
- cocos2dx事件监听器