小demo 实现二维码生成, 和扫描
2016-04-25 15:32
387 查看
#import "ViewController.h" #import <CoreImage/CoreImage.h> #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate> @property (weak, nonatomic) IBOutlet UIImageView *codeImage; @property (weak, nonatomic) IBOutlet UIButton *makeCode; @property (weak, nonatomic) IBOutlet UITextField *codeTetxt; @property(nonatomic ,strong) CIFilter *filter; @property(nonatomic ,strong) AVCaptureMetadataOutput * meta ; @property(nonatomic ,strong)AVCaptureSession * session; @property(nonatomic ,strong)AVCaptureDeviceInput * input; @property(nonatomic ,strong)AVCaptureVideoPreviewLayer * previewLayer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //生成二维码 [self make2dCode]; //开始扫描二维码 [self statScan]; } -(void)statScan { //创建获取捕捉设备 设置类型 AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //获取输入设备 AVCaptureDeviceInput * input = [[AVCaptureDeviceInput alloc]initWithDevice:device error:nil]; self.input = input; //获取输出设备元数据 AVCaptureMetadataOutput * meta = [[AVCaptureMetadataOutput alloc]init]; self.meta = meta; //创建会话 AVCaptureSession * session = [[AVCaptureSession alloc]init]; self.session = session; if ([session canAddInput:input]) { [session addInput:input]; } if ([session canAddOutput:meta]) { [session addOutput:meta]; } } -(void)make2dCode { //获取内置滤镜 NSLog(@"%@" , [CIFilter filterNamesInCategory:kCICategoryBuiltIn]); //设置滤镜,支持二维码 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; self.filter = filter; //设置初始值 [filter setDefaults]; // self.makeCode.enabled = NO; //获取封装数据 字符串 inputMessage NSLog(@"%@" ,filter.inputKeys); //监听键盘frame是否变化 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardDidChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapClick:)]; [self.view addGestureRecognizer:tap]; } //当解析完毕调用, 返回一个字符串 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { AVMetadataMachineReadableCodeObject * objc = [metadataObjects firstObject]; NSLog(@"%@" ,objc.stringValue); [self.session startRunning]; [self.previewLayer removeFromSuperlayer]; [self show2dCodeContent: objc.stringValue]; } -(void)show2dCodeContent:(NSString *) code { UIAlertController * alertC = [UIAlertController alertControllerWithTitle:@"扫描成功" message:code preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction * action = [UIAlertAction actionWithTitle:@"确定"style:UIAlertActionStyleDestructive handler:nil]; UIAlertAction * action1 = [UIAlertAction actionWithTitle:@"取消"style:UIAlertActionStyleCancel handler:nil]; [alertC addAction:action]; [alertC addAction:action1]; [self presentViewController:alertC animated:YES completion:nil]; } //生成二维码按钮 - (IBAction)makeCodeClick:(id)sender { [self.view endEditing:YES]; self.view.transform = CGAffineTransformIdentity; //设置二维码内容 [self.filter setValue:[self.codeTetxt.text dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"]; //生成二维码图片 放大图片 CIImage * twoDCode = [self.filter.outputImage imageByApplyingTransform:CGAffineTransformMakeScale(5, 5)]; self.codeImage.image = [UIImage imageWithCIImage:twoDCode]; } /* UIKeyboardAnimationDurationUserInfoKey = "0.25"; UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {375, 258}}"; UIKeyboardCenterBeginUserInfoKey = "NSPoint: {187.5, 796}"; UIKeyboardCenterEndUserInfoKey = "NSPoint: {187.5, 538}"; UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 667}, {375, 258}}"; UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 409}, {375, 258}}"; UIKeyboardIsLocalUserInfoKey = 1; }*/ //监控键盘frame改变的通知方法 -(void)keyboardDidChangeFrame:(NSNotification *)notify { NSLog(@"%@" , notify.userInfo); CGRect rect = [notify.userInfo[@"UIKeyboardFrameEndUserInfoKey"]CGRectValue]; if (rect.origin.y == [UIScreen mainScreen].bounds.size.height-rect.size.height) { self.view.transform = CGAffineTransformMakeTranslation(0, -rect.size.height); }else if (rect.origin.y == [UIScreen mainScreen].bounds.size.height){ self.view.transform = CGAffineTransformIdentity; } } -(void)tapClick:(UIGestureRecognizer *)tap { [self.view endEditing:YES]; } //textLable事件 - (IBAction)codeTextValueChange:(id)sender { if ([self.codeTetxt hasText]) { self.makeCode.enabled = YES; }else{ self.makeCode.enabled = NO; } } //扫描二维码 - (IBAction)scan2dCode:(id)sender { //只有将输入设备与输出设备建立会话之后, 才能获取输出设备的元数据类型 NSLog(@"---------%@" ,self.meta.availableMetadataObjectTypes); //设置输出元数据类型 二维码 [self.meta setMetadataObjectTypes:@[@"org.iso.QRCode"]]; //设置元数据代理 [self.meta setMetadataObjectsDelegate:self queue:dispatch_get_global_queue(0, 0)]; //设置会话范围(也就是视频范围) [self.session setSessionPreset:AVCaptureSessionPresetHigh]; //开始会话 [self.session startRunning]; //添加一个预览画面, 来展示输入设备画面 AVCaptureVideoPreviewLayer * previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session]; self.previewLayer = previewLayer; previewLayer.frame = self.view.bounds; [self.view.layer addSublayer:previewLayer]; }
相关文章推荐
- 为什么UDP有时比TCP更有优势
- 系统文件误删除恢复
- Lua_第24章 扩展你的程序
- 排序之快速排序
- cin.tie与sync_with_stdio加速输入输出
- Android RecyclerView通用适配器
- Java线程详解
- java struct2 过滤器和拦截器的区别
- 网狐系统介绍
- Windows Touch 便笺簿的
- cojs 自己出的题目 解题报告
- js读取COOKIE,与无法删除COOKIE
- JDK1.8 HashMap中resize()方法解释
- ie浏览器兼容性css
- 每周学习进度 第七周
- CCTF-PWN1&&PWN3
- 加断点的两个小技巧
- Java/Android单例模式的简单理解
- 快速入门Activiti相关资料
- 新手福利!一份详尽全面的UI设计字体与排版指南