您的位置:首页 > 其它

小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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: