概要
现在越来越多的应用加入二维码相关的业务,在iOS开发市场上很多开发人员都在使用第三方的扫码与生成二维码的控件,个人认为此类的第三方控件识别度不高。最近正好整理新框架的事情,研究了一下。具体代码如下
生成二维码代码
/***  @author 半    饱, 15-12-18**  @brief  生成二维码图片**  @param code   生成二维码图片内容*  @param width  二维码图片宽度*  @param height 二维码图片高度**  @return 返回UIImage对象*/
- (UIImage *)generateQRCode:(NSString *)code width:(CGFloat)width height:(CGFloat)height {CIImage *qrcodeImage;NSData *data = [code dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:false];CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];[filter setValue:data forKey:@"inputMessage"];[filter setValue:@"H" forKey:@"inputCorrectionLevel"];qrcodeImage = [filter outputImage];CGFloat scaleX = width / qrcodeImage.extent.size.width;CGFloat scaleY = height / qrcodeImage.extent.size.height;CIImage *transformedImage = [qrcodeImage imageByApplyingTransform:CGAffineTransformScale(CGAffineTransformIdentity, scaleX, scaleY)];return [UIImage imageWithCIImage:transformedImage];
}
扫描二维码代码
#import <AVFoundation/AVFoundation.h>static const float lightWidth = 240.f;
static const float lightHeight = 240.f;
static const float crossLineWidth = 2.f;
static const float crossLineHeight = 15.f;@interface BBScanCodeViewController ()<AVCaptureMetadataOutputObjectsDelegate> {float leftWith;float topHeight;
}
@property (strong , nonatomic ) AVCaptureDevice *captureDevice;
@property (strong , nonatomic ) AVCaptureDeviceInput *captureInput;
@property (strong , nonatomic ) AVCaptureMetadataOutput *captureOutput;
@property (strong , nonatomic ) AVCaptureSession *captureSession;
@property (strong , nonatomic ) AVCaptureVideoPreviewLayer *capturePreview;@property (strong,nonatomic) UIButton *flashLightBtn;
@property (strong,nonatomic) UIImageView *lineImageView;@end@implementation BBScanCodeViewController
@synthesize captureDevice = _captureDevice;
@synthesize captureInput = _captureInput;
@synthesize captureOutput = _captureOutput;
@synthesize capturePreview = _capturePreview;
@synthesize captureSession = _captureSession;
@synthesize  delegate = _delegate;
@synthesize  isRectScan = _isRectScan;
@synthesize lineImageView = _lineImageView;
@synthesize  flashLightBtn = _flashLightBtn;
- (void)viewDidLoad {[super viewDidLoad];self.isShowNavigationItem = YES;CGRect screenRect = [UIScreen mainScreen].bounds;leftWith = (screenRect.size.width - lightWidth) /  2;topHeight =(screenRect.size.height - lightHeight) /  2;#if !TARGET_IPHONE_SIMULATOR[self initScanCode];
#endif[self initLayer];[self initViewControl];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignActiveNotification) name:UIApplicationWillResignActiveNotification object:nil]; //监听是否触发home键挂起程序.[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActiveNotification) name:UIApplicationDidBecomeActiveNotification object:nil]; //监听是否重新进入程序程序.
}-(void)viewWillDisappear:(BOOL)animated {[self stopScanCode];[super viewWillDisappear:animated];
}- (void)willResignActiveNotification {_flashLightBtn.selected = NO;
}
- (void)didBecomeActiveNotification {}
//加载界面上的控件,如:加上闪光灯按钮等
- (void)initViewControl {@autoreleasepool {_flashLightBtn = [UIButton buttonWithType:UIButtonTypeCustom];[_flashLightBtn setImage:[UIImage imageNamed:@"OpenFlashLight.png"] forState:UIControlStateNormal];[_flashLightBtn setImage:[UIImage imageNamed:@"CloseFlashLight.png"] forState:UIControlStateSelected];_flashLightBtn.frame = CGRectMake(leftWith, 80.f, 30.f, 30.f);[_flashLightBtn addTarget:self action:@selector(systemFlashLight) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_flashLightBtn];_lineImageView = [[UIImageView alloc] initWithImage:nil];_lineImageView.backgroundColor = [UIColor greenColor];_lineImageView.frame = CGRectMake(leftWith, topHeight, lightWidth, 2);[self.view addSubview:_lineImageView];[self scanLineAnimation];}}- (void)scanLineAnimation {[UIView beginAnimations:nil context:nil];[UIView setAnimationDuration:4.f];//设置代理[UIView setAnimationDelegate:self];//设置动画执行完毕调用的事件[UIView setAnimationDidStopSelector:@selector(didViewAnimation)];_lineImageView.frame = CGRectMake(leftWith,topHeight + lightHeight-2,lightWidth,2);[UIView commitAnimations];}-(void)didViewAnimation {
//    self.navigationController_lineImageView.frame = CGRectMake(leftWith, topHeight, lightWidth, 2);[self scanLineAnimation];
}- (void)insertLayerWithFrame:(CGRect)frame withBackgroundColor:(UIColor *)backgroundColor {@autoreleasepool {CALayer *layer = [CALayer layer];layer.backgroundColor = backgroundColor.CGColor;layer.frame = frame;[self.view.layer addSublayer:layer];}
}
//初始化layer层,绘制半透明区域
-(void) initLayer {//公共参数UIColor *fillColor = [UIColor colorWithRed:0xae/255.f green:0xae/255.f blue:0xae/255.f alpha:0.4];UIColor *crossColor = [UIColor greenColor];CGRect screenRect = [UIScreen mainScreen].bounds;[self insertLayerWithFrame:CGRectMake(0, 0, leftWith, screenRect.size.height) withBackgroundColor:fillColor];[self insertLayerWithFrame:CGRectMake(leftWith, 0, lightWidth, topHeight) withBackgroundColor:fillColor];[self insertLayerWithFrame:CGRectMake(leftWith + lightWidth, 0, leftWith, screenRect.size.height) withBackgroundColor:fillColor];[self insertLayerWithFrame:CGRectMake(leftWith, topHeight + lightHeight, lightWidth, topHeight) withBackgroundColor:fillColor];[self insertLayerWithFrame:CGRectMake(leftWith, topHeight, crossLineWidth, crossLineHeight) withBackgroundColor:crossColor];[self insertLayerWithFrame:CGRectMake(leftWith, topHeight, crossLineHeight, crossLineWidth) withBackgroundColor:crossColor];[self insertLayerWithFrame:CGRectMake(leftWith + lightWidth - crossLineHeight, topHeight, crossLineHeight, crossLineWidth) withBackgroundColor:crossColor];[self insertLayerWithFrame:CGRectMake(leftWith + lightWidth - crossLineWidth, topHeight, crossLineWidth, crossLineHeight) withBackgroundColor:crossColor];[self insertLayerWithFrame:CGRectMake(leftWith, topHeight + lightHeight - crossLineHeight, crossLineWidth, crossLineHeight) withBackgroundColor:crossColor];[self insertLayerWithFrame:CGRectMake(leftWith, topHeight + lightHeight - crossLineWidth, crossLineHeight, crossLineWidth) withBackgroundColor:crossColor];[self insertLayerWithFrame:CGRectMake(leftWith + lightWidth - crossLineHeight, topHeight + lightHeight - crossLineWidth, crossLineHeight, crossLineWidth) withBackgroundColor:crossColor];[self insertLayerWithFrame:CGRectMake(leftWith + lightWidth - crossLineWidth, topHeight + lightHeight - crossLineHeight, crossLineWidth, crossLineHeight) withBackgroundColor:crossColor];
}-(void)initScanCode {@autoreleasepool {_captureDevice = [ AVCaptureDevice defaultDeviceWithMediaType : AVMediaTypeVideo];_captureInput = [ AVCaptureDeviceInput deviceInputWithDevice : _captureDevice error : nil ];_captureOutput = [[ AVCaptureMetadataOutput alloc ] init ];[_captureOutput setMetadataObjectsDelegate : self queue : dispatch_get_main_queue ()];if (_isRectScan) {CGRect screenRect = [UIScreen mainScreen].bounds;[ _captureOutput setRectOfInterest : CGRectMake (topHeight / screenRect.size.height, leftWith / screenRect.size.width, lightHeight/screenRect.size.height, lightWidth / screenRect.size.width)];}_captureSession = [[ AVCaptureSession alloc ] init ];[_captureSession setSessionPreset : AVCaptureSessionPresetHigh ];if ([_captureSession canAddInput : _captureInput ]){[_captureSession addInput : _captureInput ];}if ([_captureSession canAddOutput : _captureOutput ]){[_captureSession addOutput : _captureOutput ];}_captureOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode ] ;_capturePreview =[ AVCaptureVideoPreviewLayer layerWithSession :_captureSession ];_capturePreview.videoGravity = AVLayerVideoGravityResizeAspectFill ;_capturePreview.frame = self.view.layer.bounds ;[self.view.layer insertSublayer : _capturePreview atIndex : 0 ];[_captureSession startRunning ];}
}- ( void )captureOutput:( AVCaptureOutput *)captureOutput didOutputMetadataObjects:( NSArray *)metadataObjects fromConnection:( AVCaptureConnection *)connection
{if (metadataObjects != nil && [metadataObjects count] > 0) {AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];NSString *scanCodeResult;if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {[self stopScanCode];scanCodeResult = metadataObj.stringValue;//回调信息if (_delegate && [_delegate respondsToSelector:@selector(scanCodeResultByViewController:withScanCodeResult:)]) {[_delegate scanCodeResultByViewController:self withScanCodeResult:scanCodeResult];[self.navigationController popViewControllerAnimated:YES];}} else {NSLog(@"扫描信息错误!");}}
}- (void)systemFlashLight
{
#if !TARGET_IPHONE_SIMULATORif([_captureDevice hasTorch] && [self.captureDevice hasFlash]){[_captureSession beginConfiguration];[_captureDevice lockForConfiguration:nil];if(_captureDevice.torchMode == AVCaptureTorchModeOff){_flashLightBtn.selected = YES;[_captureDevice setTorchMode:AVCaptureTorchModeOn];[_captureDevice setFlashMode:AVCaptureFlashModeOn];}else {_flashLightBtn.selected = NO;[_captureDevice setTorchMode:AVCaptureTorchModeOff];[_captureDevice setFlashMode:AVCaptureFlashModeOff];}[_captureDevice unlockForConfiguration];[_captureSession commitConfiguration];}
#else[CommonUtil showAlert:G_ALERTTITLE withMessage:@"虚拟设备不能运行摄像头!"];
#endif
}-(void)stopScanCode {[_captureSession stopRunning];_captureSession = nil;_captureDevice = nil;_captureInput = nil;_captureOutput = nil;[_capturePreview removeFromSuperlayer];
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];
}@end
版权所有:半 饱 开发专栏
版本转载:http://blog.csdn.net/banbaodevelop
ps:如有转载请加以上信息

iOS二维码生成及扫码相关推荐

  1. 【科普文】二维码的[生成]和[扫码]

    作者:孙辉,美团金融前端团队成员.15年毕业加入美团,相信技术,更相信技术只是大千世界里知识的一种,个人博客: sunyuhui.com 最近这段时间,团队在做的业务主要和二维码相关,在做的过程中,发 ...

  2. 二维码和app扫码下载

    文章目录 二维码基本原理 二级码生成 在线二维码生成 java代码生成二维码 前端二维码生成 app扫码下载 二维码基本原理 参考: https://cli.im/help/48235 二维条码是指在 ...

  3. iOS二维码识别/二维码生成

    文章目录 前言 扫一扫识别二维码图片 长按图片识别二维码图片 生成二维码图片 代码完善 识别二维码图片优化 小结 前言 最近在做一个关于二维码的组件,已发布,现总结下. 开发的APP所需支持的最低版本 ...

  4. 微信生成带参数的二维码,合成海报,扫码后推送小程序?

    微信服务号渠道二维码功能,支持生成带参数二维码,合成海报二维码,微信扫码后推送内容:结合微号帮平台48小时信息推送,推送微信小程序. 带参二维码 海报二维码 微信扫码后回复 48小时信息推送 在微号帮 ...

  5. vue前端生成二维码,实现扫码下载功能

    vue前端生成二维码,实现扫码下载功能 首先需要安装一个插件 npm install --save qrcodejs2 然后在需要的页面引入插件,最后使用 <template><di ...

  6. iOS AV Foundation 二维码扫描 02 扫码

    AVFoundation支持以下一维和二维码的扫描: QR code Aztec EAN13 EAN8 UPC-E PDF417 Code 93 Code 39 Code 39 mode 41 QR ...

  7. iOS二维码生成中间带图片Logo

    iOS二维码生成中间带图片效果图: ViewController.h 1 #import <UIKit/UIKit.h> 2 @interface ViewController : UIV ...

  8. iOS二维码生成(带logo)

    实在不好意思,昨天忘记写的<<二维码生成>>忘记写最常见的黑白二维码嵌入一张图片,一般都是公司的logo.今天补上 // // ViewController.m // 内置图片 ...

  9. wechat-0050,微信公众号,带参数的二维码获取与扫码事件推送

    demo:https://github.com/wenrongyao/wechat-demo 摘要:这篇帖子讲述如何获取带参数的二维码,以及扫码带参数的二维码后的事件接收. 微信开发者文档:https ...

最新文章

  1. failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
  2. VC2005:无法执行添加/移除操作,因为代码元素是只读的....多个解决办法
  3. Qt Creator指定文本编辑器设置
  4. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。
  5. Activiti 7.1.4 发布,业务流程管理与工作流系统
  6. 硬盘突然提示没有初始化_测试流程_507283-001 硬盘 HP SAS
  7. 过年回家,走之前留一个用GDI+实现的略缩图控件
  8. Python类方法和静态方法
  9. 【Hibernate】性能优化之缓存管理
  10. mapreduce优化总结
  11. 关于创业,潮汕人、温州人做生意的多
  12. 微信全文搜索优化之路
  13. Hudson 之旅(二)
  14. [ CSS ] animation 快速参考
  15. Xcode 5设置Deployment Target
  16. MOOC 课后讨论5.2 判别是否是前缀码的算法
  17. Xcode8控制台不打印NSLog
  18. 音频(七)——数字麦克风和模拟麦克风(DMIC/AMIC)
  19. 社群运营,做好社群长期活跃可以从哪些方面入手?
  20. 流体力学(水力学)满分实验报告——伯努利方程

热门文章

  1. 视频流TS打包方式详解
  2. 石油场站三维可视化_三维bim建模_吉优赛维数字孪生可视化平台
  3. PHP Warning: ‘ vcruntime140.dll‘ 14.0 is not compatible with this PHP build linked with 14.16 in Unk
  4. 人脸识别系列(六):FaceNet
  5. latex输入单双引号
  6. 巧妙隐藏Word文档中指定文字内容
  7. eclipse启动报错: Could not reserve enough space for object heap error
  8. http、https 等 常用默认端口号
  9. 8086CPU内部结构
  10. DirectShow使用大全