zoukankan      html  css  js  c++  java
  • ios二维码扫描

    1.添加AVFoundation.framework框架

    2,控制器中实现

    //第一步添加AVFoundation.framework框架

     

     

    #import "ViewController.h"

    #import <AVFoundation/AVFoundation.h>

    #import "RYPreView.h"

     

     

    @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>

    //定义输入设备,用户采集信息,

    @property(nonatomic,strong)AVCaptureDeviceInput*input;

    //定义输出设备,处理采集的信息,获得数据

    @property(nonatomic,strong)AVCaptureMetadataOutput*outPut;

    //定义连接输入输出设备的会话

    @property(nonatomic,strong)AVCaptureSession*session;

    //定义展示信息的图层

    @property(nonatomic,strong)RYPreView*preview;

     

     

     

    @end

     

    @implementation ViewController

     

    - (void)viewDidLoad {

        [super viewDidLoad];

        //1,定义输入设备,摄像头

        AVCaptureDevice *device=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        self.input=[AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];

        //2.输出设备

        self.outPut=[[AVCaptureMetadataOutput alloc]init];

        //3.定义session会话

        self.session=[[AVCaptureSession alloc]init];

        //展示大小

        [self.session setSessionPreset:AVCaptureSessionPreset640x480];

        //添加输入输出设备

        if([self.session canAddInput:self.input])

        {

            [self.session addInput:self.input];

        }

        if ([self.session canAddOutput:self.outPut]) {

            [self.session addOutput:self.outPut];

        }

        //指定输出设备代理

        [self.outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

        //设置元数据类型 二维码

        [self.outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

        //需要一个特殊的layer来处理展示的数据 AVCaptureVideoPreviewLayer

        //方法一可以再这里创建并设置大小

        //方法二

        RYPreView *preview=[[RYPreView alloc]initWithFrame:self.view.bounds];

        preview.session=self.session;

        [self.view addSubview:preview];

        //开启会话

        [self.session startRunning];

        

        

    }

    //解析元数据调用

    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

    {

        //停止会话

        [self.session stopRunning];

        //移除视图layer

        [self.preview removeFromSuperview];

        //获取信息

        for (AVMetadataMachineReadableCodeObject* objc in metadataObjects) {

            NSLog(@"%@",objc.stringValue);

        }

    }

     

     

    @end

     

     

    #import <UIKit/UIKit.h>

    #import <AVFoundation/AVFoundation.h>

     

    @interface RYPreView : UIView

     

     

    //定义session,实现session与当前layer绑定

    @property(nonatomic,strong)AVCaptureSession*session;

     

    @end

    #import "RYPreView.h"

    @interface RYPreView()

    @property(nonatomic,strong)UIImageView*imageCover;

    @property(nonatomic,strong)UIImageView*lineImage;//

    @property(nonatomic,strong)NSTimer*timer;//动画时间间距

     

    @end

     

     

     

    @implementation RYPreView

    //自定义需要layer的类型 session 需要绑定的layer类型为AVCaptureVideoPreviewLayer

    +(Class)layerClass

    {

        return [AVCaptureVideoPreviewLayer class];

    }

    //重写set方法

    -(void)setSession:(AVCaptureSession *)session

    {

        _session=session;

        AVCaptureVideoPreviewLayer *layer=(AVCaptureVideoPreviewLayer*)self.layer;

        layer.session=session;

    }

    -(instancetype)initWithFrame:(CGRect)frame

    {

        if (self=[super initWithFrame:frame]) {

            [self addSubviewWithFrame];

        }

        return self;

    }

    //初始化自定义控件

    -(void)addSubviewWithFrame

    {

        //设置背景图片

        self.imageCover = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pick_bg.png"]];

        //设置位置到界面的中间

        self.imageCover.frame = CGRectMake(self.bounds.size.width * 0.5 - 140, self.bounds.size.height * 0.5 - 140, 280, 280);

        //添加到视图上

        [self addSubview:self.imageCover];

        

        //初始化二维码的扫描线的位置

        self.lineImage = [[UIImageView alloc] initWithFrame:CGRectMake(30, 10, 220, 2)];

        self.lineImage.image = [UIImage imageNamed:@"line.png"];

        [self.imageCover addSubview:self.lineImage];

        

        //开启定时器

        _timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(animation) userInfo:nil repeats:YES];

    }

    - (void)animation

    {

        [UIView animateWithDuration:2.8 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

            

            self.lineImage.frame = CGRectMake(30, 260, 220, 2);

            

        } completion:^(BOOL finished) {

            self.lineImage.frame = CGRectMake(30, 10, 220, 2);

        }];

    }

    @end

     

  • 相关阅读:
    开源图像标注工具labelme的安装使用及汉化
    win10启动远程桌面连接的设置
    maven 仓库搜索添加需要的jar包
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    在Myeclipse中配置Maven
    JSP过滤器Filter配置过滤类型汇总
    js中location.href的用法
    session失效后跳转到登陆页面
    JS的三种弹框
    JOptionPane.showMessageDialog出现在浏览器下面的解决方法
  • 原文地址:https://www.cnblogs.com/tangranyang/p/4656151.html
Copyright © 2011-2022 走看看