小demo 实现二维码生成, 和扫描

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

    
    
}
原文地址:https://www.cnblogs.com/yuwei0911/p/5431145.html