扫描二维码效果
源码: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实现二维码的扫描功能的使用技巧和注意事项,需要的朋友参考一下 直接上代码,就不多废话了
本文向大家介绍ios原生二维码扫描,包括了ios原生二维码扫描的使用技巧和注意事项,需要的朋友参考一下 做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing。今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描。 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries
本文向大家介绍iOS自带原生二维码扫描的实现,包括了iOS自带原生二维码扫描的实现的使用技巧和注意事项,需要的朋友参考一下 前言 首先说明的是:原生的二维码扫描有一个坑,那就是扫描范围的确定。只要记得扫描范围是X与Y互换位置,W与H互换位置,就没有什么问题了。 下面进入正题: 1.因为使用原生二维码扫描,所以需要加入头文件添加delegate 2.接着是使用到的类 3.懒加载一个扫描动画的图片 4
本文向大家介绍iOS二维码的生成和扫描,包括了iOS二维码的生成和扫描的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 属性 二维码的生成 * createNonInterpolatedUIImageFormCIImage:outputImage方法的实现 二维码的扫描 *扫描到结果后会调用的方法 以上就是本文的全
本文向大家介绍iOS 二维码扫描和应用跳转,包括了iOS 二维码扫描和应用跳转的使用技巧和注意事项,需要的朋友参考一下 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar。使用时集成麻烦,出错也不方便调试。在iOS7之后,苹果自身提供了二维码的扫描功能,从效率上来说,原生的
在 ZBarSDK(本站下载:http://code4app.com/ios/ZBar-Barcode-Reader/4fa23f3f06f6e7ee18000000)的基础上做的一个demo,能够将字符串转换成二维码,能够通过摄像头扫描二维码。代码里面有对如何使用 ZBarSDK 的详细说明。 [Code4App.com]