美文网首页
扫描二维码控件的封装

扫描二维码控件的封装

作者: 橙娃 | 来源:发表于2016-07-25 08:12 被阅读31次

    效果

    源码

    https://github.com/YouXianMing/Animations

    ////QRCodeView.h//QRCode////Created by YouXianMing on 16/7/7.//Copyright © 2016年 XianMing You. All rights reserved.//#import#import@classQRCodeView;@protocolQRCodeViewDelegate @optional/**

    *  获取QR的扫描结果

    *

    *  @param codeView  QRCodeView实体对象

    *  @param codeString 扫描字符串*/- (void)QRCodeView:(QRCodeView *)codeView codeString:(NSString *)codeString;@end@interfaceQRCodeView : UIView/**

    *  代理*/@property (nonatomic, weak)iddelegate;/**

    *  灯的状态,默认为关闭*/@property (nonatomic) AVCaptureTorchMode torchMode;/**

    *  敏感区域,如果不设置,则为全部扫描区域*/@property (nonatomic) CGRect interestArea;/**

    *  你用来添加自定义控件的view,尺寸与当前初始化的view一致*/@property (nonatomic, strong) UIView*contentView;/**

    *  正在运行当中*/@property (nonatomic,readonly) BOOL  isRunning;/**

    *  开始扫描

    *

    *  @return 如果成功,则返回YES,否则返回NO*/-(BOOL)start;/**

    *  结束扫描*/- (void)stop;@end

    ////QRCodeView.m//QRCode////Created by YouXianMing on 16/7/7.//Copyright © 2016年 XianMing You. All rights reserved.//#import"QRCodeView.h"@interfaceQRCodeView () @property (nonatomic) BOOL                                isRunning;

    @property (nonatomic, strong) UIView*videoView;

    @property (nonatomic, strong) AVCaptureDeviceInput*deviceInput;

    @property (nonatomic, strong) AVCaptureDevice*captureDevice;

    @property (nonatomic, strong) AVCaptureSession*captureSession;

    @property (nonatomic, strong) AVCaptureVideoPreviewLayer*videoPreviewLayer;

    @property (nonatomic, strong) AVCaptureMetadataOutput*captureMetadataOutput;@end@implementationQRCodeView-(instancetype)initWithFrame:(CGRect)frame {if(self =[super initWithFrame:frame]) {

    self.videoView=[[UIView alloc] initWithFrame:self.bounds];

    [self addSubview:self.videoView];

    self.contentView=[[UIView alloc] initWithFrame:self.bounds];

    [self addSubview:self.contentView];

    self.captureDevice=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    _torchMode=AVCaptureTorchModeOff;

    [self addNotificationCenter];

    }returnself;

    }#pragmamark - NSNotificationCenter related.- (void)addNotificationCenter {

    [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(notificationCenterEvent:)

    name:AVCaptureInputPortFormatDescriptionDidChangeNotificationobject:nil];

    }- (void)removeNotificationCenter {

    [[NSNotificationCenter defaultCenter] removeObserver:self

    name:AVCaptureInputPortFormatDescriptionDidChangeNotificationobject:nil];

    }- (void)notificationCenterEvent:(NSNotification *)sender {if(self.interestArea.size.width &&self.interestArea.size.height) {

    self.captureMetadataOutput.rectOfInterest=[self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.interestArea];

    }else{

    self.captureMetadataOutput.rectOfInterest= CGRectMake(0,0,1,1);

    }

    }#pragmamark - Start & Stop.-(BOOL)start {//初始化输入流BOOL    result  =NO;

    NSError*error  =nil;

    self.deviceInput= [AVCaptureDeviceInput deviceInputWithDevice:self.captureDevice error:&error];if(self.deviceInput ==nil) {

    NSLog(@"%@", error);returnresult;

    }//创建会话self.captureSession =[[AVCaptureSession alloc] init];//添加输入流[self.captureSession addInput:self.deviceInput];//初始化输出流self.captureMetadataOutput =[[AVCaptureMetadataOutput alloc] init];//添加输出流[self.captureSession addOutput:self.captureMetadataOutput];//创建queue.[self.captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatch_queue_create(nil, nil)];

    self.captureMetadataOutput.metadataObjectTypes=@[AVMetadataObjectTypeQRCode];//创建输出对象self.videoPreviewLayer =[[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];

    self.videoPreviewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;

    self.videoPreviewLayer.frame=self.contentView.bounds;

    [self.videoView.layer addSublayer:self.videoPreviewLayer];//开始[self.captureSession startRunning];

    self.isRunning=YES;

    result=YES;returnresult;

    }- (void)stop {

    [self.captureSession stopRunning];

    self.isRunning=NO;

    self.captureSession=nil;

    }#pragmamark - AVCaptureMetadataOutputObjectsDelegate- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects

    fromConnection:(AVCaptureConnection*)connection {if(metadataObjects.count >0) {

    AVMetadataMachineReadableCodeObject*metadata =metadataObjects.firstObject;

    NSString*result  =nil;if([metadata.type isEqualToString:AVMetadataObjectTypeQRCode]) {

    result=metadata.stringValue;if(_delegate &&[_delegate respondsToSelector:@selector(QRCodeView:codeString:)]) {

    [_delegate QRCodeView:self codeString:result];

    }

    }

    }

    }#pragmamark - Setter & Getter.- (void)setTorchMode:(AVCaptureTorchMode)torchMode {

    _torchMode=torchMode;if(_deviceInput &&[self.captureDevice hasTorch]) {

    [self.captureDevice lockForConfiguration:nil];

    [self.captureDevice setTorchMode:torchMode];

    [self.captureDevice unlockForConfiguration];

    }

    }#pragmamark - System method.- (void)dealloc {

    [self stop];

    [self removeNotificationCenter];

    }@end

    相关文章

      网友评论

          本文标题:扫描二维码控件的封装

          本文链接:https://www.haomeiwen.com/subject/vjegjttx.html