zoukankan      html  css  js  c++  java
  • 二维码的完整代码


    0
    1
    注意:本篇文章采用了IOS7的新特性来扫二维码,所以系统支持要IOS7以上,如果要兼容IOS7之前的版本,自行找库来支持。

    为了方便,我把扫二维码简单封装到了一个UIView中,用代理的方式返回值

    在使用之前,应当为工程添加AVFoundation.framework

    最后实现的效果如图

    完整的实现代码

    头文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    //
    //  HwcScanQRView.h
    //  HwcAnimationExample
    //
    //  Created by huangwenchen on 15/1/7.
    //  Copyright (c) 2015年 huangwenchen. All rights reserved.
    //
     
    #import <UIKit/UIKit.h>
     
    @protocol HwcScanQRDelegate <NSObject>
    /*!
    * @discussion Delegate method when scan QR successed
    * @param QRContent Scan result
    * @return Void
    */
     
    -(void)DidGetScanWithResult:(NSString *)QRContent;
    /*!
     * @discussion Delegate method when scan QR failed
     * @param error Error message
     * @return Void
     */
    -(void)DidFailToScanWithError:(NSError *)error;
    @end
     
    @interface HwcScanQRView : UIView
    @property id<HwcScanQRDelegate> delegate;
    @property(nonatomic,readonly) bool isScaning;
    -(BOOL)startScaning;
    -(void)stop;
    @end
    .m文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    //
    //  HwcScanQRView.m
    //  HwcAnimationExample
    //
    //  Created by huangwenchen on 15/1/7.
    //  Copyright (c) 2015年 huangwenchen. All rights reserved.
    //
     
    #import "HwcScanQRView.h"
    #import  <AVFoundation/AVFoundation.h>
    @interface HwcScanQRView()<AVCaptureMetadataOutputObjectsDelegate>
     
    @property(nonatomic,readwrite) bool isScaning;
    @property(strong,nonatomic)AVCaptureSession * captureSession;
    @property(strong,nonatomic)AVCaptureVideoPreviewLayer * vedioPreviewLayer;
    @end
     
    @implementation HwcScanQRView
     
    #pragma mark - Propertys
    -(AVCaptureSession *)captureSession{
        if (!_captureSession) {
            _captureSession = [[AVCaptureSession alloc] init];
        }
        return  _captureSession;
    }
     
    -(AVCaptureVideoPreviewLayer *)vedioPreviewLayer{
        if (!_vedioPreviewLayer) {
            _vedioPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
        }
        return _vedioPreviewLayer;
    }
    #pragma mark - QRScan function
    -(BOOL)startScaning{
        NSError * error;
        AVCaptureDevice * captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        AVCaptureDeviceInput * deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
        if (!deviceInput) {
            if ([self.delegate respondsToSelector:@selector(DidFailToScanWithError:)]) {
                [self.delegate DidFailToScanWithError:error];
            }
            return NO;
        }
        [self.captureSession addInput:deviceInput];
        AVCaptureMetadataOutput * captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
        [self.captureSession addOutput:captureMetadataOutput];
        dispatch_queue_t scanQRqueue;
        scanQRqueue = dispatch_queue_create("scanQRqueue",DISPATCH_QUEUE_SERIAL);
        [captureMetadataOutput setMetadataObjectsDelegate:self queue:scanQRqueue];
        [captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
        [self.vedioPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        [self.vedioPreviewLayer setFrame:self.layer.bounds];
        [self.layer addSublayer:self.vedioPreviewLayer];
        [self.captureSession startRunning];
        return YES;
    }
    -(void)stop{
        [self.captureSession stopRunning];
        self.isScaning = NO;
        self.captureSession = nil;
        [_vedioPreviewLayer removeFromSuperlayer];
    }
    #pragma mark - AVFoundation delegate method
    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
        if (metadataObjects != nil && metadataObjects.count > 0) {
            AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects firstObject];
            if ([[metadataObject type] isEqualToString:AVMetadataObjectTypeQRCode]) {
                NSString * scanResult = [metadataObject stringValue];
                dispatch_async(dispatch_get_main_queue(), ^{
                    if ([self.delegate respondsToSelector:@selector(DidGetScanWithResult:)]) {
                        [self.delegate DidGetScanWithResult:scanResult];
                    }
                });
            }
        }
    }
     
    @end

    在使用的类中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    //
    //  ViewController.m
    //  HwcAnimationExample
    //
    //  Created by huangwenchen on 15/1/6.
    //  Copyright (c) 2015年 huangwenchen. All rights reserved.
    //
     
    #import "ViewController.h"
    #import "HwcScanQRView.h"
    @interface ViewController ()<HwcScanQRDelegate>//这里实现代理
    @property (strong,nonatomic)UILabel * scanresultLabel;
    @end
     
    @implementation ViewController
     
    - (void)viewDidLoad {
        [super viewDidLoad];
        HwcScanQRView * scanView = [[HwcScanQRView alloc] initWithFrame:CGRectMake(100,100,200, 200)];
        scanView.delegate = self;//这一步必须的
        [self.view addSubview:scanView];
        self.scanresultLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 320, 200, 30)];
        [self.view addSubview:self.scanresultLabel];
        [scanView startScaning];//不要忘记开始扫描
    }
    //两个代理方法
    -(void)DidGetScanWithResult:(NSString *)QRContent{
        self.scanresultLabel.text = QRContent;
    }
    -(void)DidFailToScanWithError:(NSError *)error{
        NSLog(@"%@",error.localizedDescription);
    }
     
    @end

     

  • 相关阅读:
    vscode常用快捷键及常用设置
    markdown语法笔记
    Recoil 了解一下
    url的组成
    webpack基础配置
    Unity3D 游戏引擎之详解游戏开发音频的播放
    未能加载文件或程序集“AspNetPager”或它的某一个依赖项。参数错误
    Windows* 8商店与桌面应用开发
    unity3d阶段性学习脚本代码(2个是摄像机跟随(2D游戏中的),1个是角色跳跃移动脚本)
    unity3d与web交互的方法
  • 原文地址:https://www.cnblogs.com/Mrliheng/p/5377388.html
Copyright © 2011-2022 走看看