当前位置:首页 > 通信资讯 > 正文

Ios扫描二维码(ios二维码生成器)

iOS二维码生成及扫码

现在越来越多的应用加入二维码相关的业务,在iOS开发市场上很多开发人员都在使用第三方的扫码与生成二维码的控件,个人认为此类的第三方控件识别度不高。最近正好整理新框架的事情,研究了一下。具体代码如下

生成二维码代码

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /** * @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]; }

扫描二维码代码

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 #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_SIMULATOR if([_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/article/details/50350807

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

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