扫描二维码控件的封装iOS实现_IOS

扫描二维码效果

 

源码:https://github.com/YouXianMing/Animations 

//
// QRCodeView.h
// QRCode
//
// Created by YouXianMing on 16/7/7.
// Copyright  2016年 XianMing You. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@class QRCodeView;

@protocol QRCodeViewDelegate <NSObject>

@optional

/**
 * 获取QR的扫描结果
 *
 * @param codeView QRCodeView实体对象
 * @param codeString 扫描字符串
 */
- (void)QRCodeView:(QRCodeView *)codeView codeString:(NSString *)codeString;

@end

@interface QRCodeView : UIView

/**
 * 代理
 */
@property (nonatomic, weak) id <QRCodeViewDelegate> delegate;

/**
 * 灯的状态,默认为关闭
 */
@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"

@interface QRCodeView () <AVCaptureMetadataOutputObjectsDelegate>

@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

@implementation QRCodeView

- (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];
 }

 return self;
}

#pragma mark - NSNotificationCenter related.

- (void)addNotificationCenter {

 [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(notificationCenterEvent:)
             name:AVCaptureInputPortFormatDescriptionDidChangeNotification
            object:nil];
}

- (void)removeNotificationCenter {

 [[NSNotificationCenter defaultCenter] removeObserver:self
             name:AVCaptureInputPortFormatDescriptionDidChangeNotification
             object: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);
 }
}

#pragma mark - Start & Stop.

- (BOOL)start {

 // 初始化输入流
 BOOL  result = NO;
 NSError *error = nil;
 self.deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:self.captureDevice error:&error];
 if (self.deviceInput == nil) {

  NSLog(@"%@", error);
  return result;
 }

 // 创建会话
 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;

 return result;
}

- (void)stop {

 [self.captureSession stopRunning];
 self.isRunning  = NO;
 self.captureSession = nil;
}

#pragma mark - 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];
   }
  }
 }
}

#pragma mark - Setter & Getter.

- (void)setTorchMode:(AVCaptureTorchMode)torchMode {

 _torchMode = torchMode;

 if (_deviceInput && [self.captureDevice hasTorch]) {

  [self.captureDevice lockForConfiguration:nil];
  [self.captureDevice setTorchMode:torchMode];
  [self.captureDevice unlockForConfiguration];
 }
}

#pragma mark - System method.

- (void)dealloc {

 [self stop];
 [self removeNotificationCenter];
}

@end

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索iOS扫描二维码
iOS二维码控件
swift 封装二维码扫描、java实现二维码扫描、html5实现二维码扫描、h5实现二维码扫描、js实现二维码扫描,以便于您获取更多的相关知识。

时间: 2024-11-05 21:59:27

扫描二维码控件的封装iOS实现_IOS的相关文章

在DevExpress程序中使用条形码二维码控件,以及进行报表打印处理

在很多业务系统里面,越来越多涉及到条形码.二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码.二维码的标签,直接在流程中进行扫描处理,仅仅在界面勾选一些处理选项即可,极大提高工作效率,降低出错的几率.本篇随笔介绍如何在基于WInform的DevExpress程序中对条形码.二维码的处理,包括界面展示,报表打印等常规的处理. 1.DevExpress的条形码操作及报表打印 在15.1以上的DevEpxress版

微信扫描二维码后 图片加载不出来是怎么回事 标题是出来了 就是图片不能出来

问题描述 微信扫描二维码后 图片加载不出来是怎么回事 标题是出来了 就是图片不能出来 这个功能主要想是扫描二维码后 可以预览图片

微信公众平台java开发关于微信扫描二维码的问题

问题描述 微信公众平台java开发关于微信扫描二维码的问题 某微信用户已经关注了我的公众号,然后他扫描了我公众平台的一个二维码,我想获取他的用户名,要怎么做?扫描二维码,是一个触发事件吗? 感谢各位了! 解决方案 他如果仅仅只是扫描的话,你是看不到他的用户名的.但是如果他关注了你的公众号,你在公众平台的用户管理里,是可以看到他的用户名信息的.希望能够帮到你. 解决方案二: 这个问题我自己研究的差不多了.用微信自己的扫一扫功能是不可能将事件推送给自己的公众平台的,我想它是推送事件给微信的公众平台了

Zxing 是如何扫描二维码的?用到Zxing的什么接口?

问题描述 Zxing 是如何扫描二维码的?用到Zxing的什么接口? Zxing 是如何扫描二维码的?用到Zxing的什么接口?什么包下的,最好能解说一下,谢谢 解决方案 参考:http://blog.csdn.net/hellogv/article/details/6101663 解决方案二: 参考:http://blog.sina.com.cn/s/blog_6ba6492f0101i0hd.html

手机QQ浏览器怎么扫描二维码?

  手机QQ浏览器怎么扫描二维码?           1.看到页面顶部地址栏旁的二维码图标了吗,点击它   2.将二维码放入取景框里,手机对焦后便会自动跳转  

百度手机浏览器怎么扫描二维码

  随着二维码的流行,越来越多人的习惯拿起手机扫描二维码下载应用.浏览资讯等.那么百度手机浏览器怎么扫描二维码呢?接下来,小编为大家详细介绍一下百度手机浏览器扫描二维码步骤,有需要的朋友赶紧来看看吧! 1.进入手机百度浏览器,点击右上角的[二维码]标志; 2.将二维码放入扫描框内; 3.随后便会在百度浏览器内打开二维码的内容. 好了,百度浏览器手机扫描二维码的具体步骤就为大家介绍到这里了,希望对大家有所帮助.

中华浏览器扫描二维码在哪里

  1)打开中华浏览器进入,然后再点击页面下方[三],按箭头方向向左划动两次. 2)进入后再点击[扫描二维码]即可.         注:更多精彩教程请关注三联手机教程栏目,三联手机数码群:296605639欢迎你的加入

百度浏览器扫描二维码以便加入会员或者查看详情

  现如今,很多时候,需要我们扫描二维码来加入会员或者查看详细的信息内容.在百度浏览器中,如何扫描二维码?只需要简单的三个步骤即可搞定. 1.进入手机百度浏览器,点击右上角的[二维码]标志. 百度浏览器 2.将二维码放入扫描框内. 百度浏览器 3.随后便会在百度浏览器内打开二维码的内容. 百度浏览器

微信mac版支持扫描二维码登陆

  Mac版微信上线了: 和网页版一样,Mac 版微信只能通过手机扫描二维码而不能直接输入用户名和密码登陆.需要特别注意的是,微信Mac版仅适用于Mac OS X 10.7(Lion)及以上系统. 登陆后页面: 简单测试了一下,网页版微信有的功能 Mac 版都有了 -- 发起群组聊天.修改备注名.传文件以及截图等.同时还增加了快捷键功能,比如同时按 Control+Command+A 就是截图这种. PS: 如果遇到安装包损坏的情况,可以参考以下方法解决.