feedback_ios_demo/YWFeedbackDemo/Util/AVQRViewController.m (138 lines of code) (raw):

// // AVQRViewController.m // YWFeedbackKit // // Created by Fujun on 15/7/2. // Copyright (c) 2015年 alibaba. All rights reserved. // #import "AVQRViewController.h" static CGFloat const kFocusViewLeftInterval = 60.0f; static CGFloat const kTitleLabelHeight = 20.0f; @interface AVQRViewController () @property (strong, nonatomic) UIImageView *focusView; @end @implementation AVQRViewController - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"关闭" style:UIBarButtonItemStylePlain target:self action:@selector(dismissView)]; closeButton.tintColor = [UIColor blackColor]; self.navigationItem.leftBarButtonItem = closeButton; [self setupCamera]; [self initialWithFocusView]; } - (void)dismissView { [self.navigationController dismissViewControllerAnimated:YES completion:nil]; } - (void)initialWithFocusView { CGFloat width = self.view.frame.size.width-kFocusViewLeftInterval*2; UIGraphicsBeginImageContext(CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSetRGBFillColor(ctx, 0,0,0,0.4); CGSize screenSize = [UIScreen mainScreen].bounds.size; CGRect drawRect = CGRectMake(0, 0, screenSize.width,screenSize.height); CGContextFillRect(ctx, drawRect); drawRect = CGRectMake(kFocusViewLeftInterval, (self.view.frame.size.height-width)/2-20, width, width); CGContextClearRect(ctx, drawRect); UIImage *qrMaskImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); self.focusView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; self.focusView.image = qrMaskImage; [self.view addSubview:self.focusView]; UILabel *noticeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, drawRect.origin.y + drawRect.size.height + kTitleLabelHeight, self.view.frame.size.width, kTitleLabelHeight)]; noticeLabel.backgroundColor = [UIColor clearColor]; noticeLabel.textColor = [UIColor whiteColor]; noticeLabel.textAlignment = NSTextAlignmentCenter; noticeLabel.font = [UIFont systemFontOfSize:15.0f]; noticeLabel.text = @"将二维码放入框中,即可自动扫描"; [self.focusView addSubview:noticeLabel]; UIView *borderView = [[UIView alloc] initWithFrame:drawRect]; borderView.backgroundColor = [UIColor clearColor]; borderView.layer.borderWidth = 1.0f; borderView.layer.borderColor = [UIColor whiteColor].CGColor; [self.focusView addSubview:borderView]; } - (void)setupCamera { self.avDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; self.avInput = [AVCaptureDeviceInput deviceInputWithDevice:self.avDevice error:nil]; self.avOutput = [[AVCaptureMetadataOutput alloc]init]; [self.avOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; self.avSession = [[AVCaptureSession alloc]init]; if([self.avSession canSetSessionPreset:AVCaptureSessionPresetHigh]) { [self.avSession setSessionPreset:AVCaptureSessionPresetHigh]; } else { [self.avSession setSessionPreset:AVCaptureSessionPresetMedium]; } //判断有无相机权限 if ([self.avSession canAddInput:self.avInput]) { [self.avSession addInput:self.avInput]; } if ([self.avSession canAddOutput:self.avOutput]) { [self.avSession addOutput:self.avOutput]; } if ([self.avOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeQRCode]) { self.avOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode]; } else { __weak typeof(self) weakSelf = self; [self showErrorViewWithText:@"请在设置中打开相机功能" clickBlock:^{ [weakSelf dismissView]; }]; return; } self.avPreview = [AVCaptureVideoPreviewLayer layerWithSession:self.avSession]; self.avPreview.videoGravity = AVLayerVideoGravityResizeAspectFill; self.avPreview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); [self.view.layer insertSublayer:self.avPreview atIndex:0]; [self.avSession startRunning]; } #pragma mark AVCaptureMetadataOutputObjectsDelegate - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { NSString *stringValue; if ([metadataObjects count] >0) { AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0]; stringValue = metadataObject.stringValue; } [self.avSession stopRunning]; NSLog(@"扫描结果 = %@", stringValue); if ([stringValue canBeConvertedToEncoding:NSShiftJISStringEncoding]) { stringValue = [NSString stringWithCString:[stringValue cStringUsingEncoding:NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding]; } if (self.readFinishedBlock) { self.readFinishedBlock(stringValue); } } - (void)showErrorViewWithText:(NSString *)text clickBlock:(void (^)())clickBlock { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:text preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { if (clickBlock) { clickBlock(); } }]; [alert addAction:cancelAction]; [self presentViewController:alert animated:YES completion:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end