IT虾米网

IOS 扫二维码详解

leader 2018年06月23日 手机开发 455 0
注意:本篇文章采用了IOS7的新特性来扫二维码,所以系统支持要IOS7以上,如果要兼容IOS7之前的版本,自行找库来支持。

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

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

最后实现的效果如图

完整的实现代码

头文件


// 
//  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文件



// 
//  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 

在使用的类中



// 
//  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

来自: blog.csdn.net/hello_hwc
发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

sqlite之增删改查实例 - 实现简单的iOS收藏夹功能详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。