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