zoukankan      html  css  js  c++  java
  • 小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];
    
        
        
    }
    
  • 相关阅读:
    pycharm连接数据库报错:1130-host ... is not allowed to connect to this MySql server如何处理
    Linux 下清空或删除大文件内容的 5 种方法
    使用dos命令创建多模块Maven项目
    使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)
    Kafka设计解析(二) Kafka High Availability (上)
    Kafka设计解析(一) Kafka背景及架构介绍
    nginx日志切割并使用flume-ng收集日志
    kafka迁移与扩容
    Kafka中的Message Delivary机制
    Kafka Topic动态迁移 (源代码解析)
  • 原文地址:https://www.cnblogs.com/yuwei0911/p/5431145.html
Copyright © 2011-2022 走看看