| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- //
- // RAQRCodeScannerViewController.m
- // Apex And Drivers
- //
- // Created by Jack on 2018/6/5.
- // Copyright © 2018年 USAI. All rights reserved.
- //
- #import "RAQRCodeScannerViewController.h"
- #import <AVKit/AVKit.h>
- @interface RAQRCodeScannerViewController () <AVCaptureMetadataOutputObjectsDelegate>
- @property (strong, nonatomic) IBOutlet UIView *scanerView;
- @property (nonatomic,strong) IBOutlet UIView *previewContainer;
- @property (nonatomic,strong) AVCaptureDevice *device;
- @property (nonatomic,strong) AVCaptureDeviceInput *input;
- @property (nonatomic,strong) AVCaptureMetadataOutput *output;
- @property (nonatomic,strong) AVCaptureSession *session;
- @property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewLayer;
- @property (nonatomic,assign) BOOL scannerEnable;
- @property (nonatomic,assign) BOOL scannerInitial;
- @property (nonatomic,strong) CAGradientLayer *scanLineLayer;
- @end
- @implementation RAQRCodeScannerViewController
- + (instancetype)viewControllerFromStoryboard {
- RAQRCodeScannerViewController *scannerVC = [[UIStoryboard storyboardWithName:@"QRCode" bundle:nil] instantiateViewControllerWithIdentifier:[self storyboardID]];
- return scannerVC;
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view.
-
- self.scanerView.layer.borderColor = [UIColor blackColor].CGColor;
- self.scanerView.layer.borderWidth = 0.5f;
-
- [self initCapture];
- }
- - (void)viewDidLayoutSubviews {
- [super viewDidLayoutSubviews];
-
- self.previewLayer.frame = self.view.bounds;
-
- CGFloat w = CGRectGetWidth(self.view.bounds);
- CGFloat h = CGRectGetHeight(self.view.bounds);
-
- /**
- rectOfInterest 都是按照横屏来计算的 所以当竖屏的情况下 x轴和y轴要交换一下
- 否则在竖屏下不能扫描条形码。
- */
- CGRect rect = CGRectMake(CGRectGetMinY(self.scanerView.frame) / h, CGRectGetMinX(self.scanerView.frame) / w, CGRectGetHeight(self.scanerView.frame) / h, CGRectGetWidth(self.scanerView.frame) / w);
-
- [self.output setRectOfInterest:rect];
-
- [self.view bringSubviewToFront:self.scanerView];
-
- CGRect scanlineFrame = CGRectMake(0, CGRectGetMidY(self.scanerView.bounds) - 0.5, CGRectGetWidth(self.scanerView.bounds), 1);
- self.scanLineLayer.frame = scanlineFrame;
- [self.scanerView.layer insertSublayer:self.scanLineLayer atIndex:0];
- }
- - (void)viewDidAppear:(BOOL)animated {
- [super viewDidAppear:animated];
-
- if (self.scannerInitial) {
- [self.session startRunning];
- }
- }
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
-
- if ([self.session isRunning]) {
- [self.session stopRunning];
- }
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- - (CAGradientLayer *)scanLineLayer {
- if (!_scanLineLayer) {
- CAGradientLayer *gradientLayer = [CAGradientLayer layer];
- //set gradient colors
- // 数组成员接受 CGColorRef 类型的值
- gradientLayer.colors = @[(__bridge id)[UIColor colorWithRed:1 green:0 blue:0 alpha:0.2].CGColor,(__bridge id)[UIColor redColor].CGColor,(__bridge id)[UIColor colorWithRed:1 green:0 blue:0 alpha:0.2].CGColor];
-
- gradientLayer.locations = @[@2.5,@0.5,@0.75];
- gradientLayer.startPoint = CGPointMake(0, 0);
- gradientLayer.endPoint = CGPointMake(1, 0);
- _scanLineLayer = gradientLayer;
- }
- return _scanLineLayer;
- }
- #pragma mark - Init
- - (void)initCapture {
-
- self.scannerInitial = NO;
- self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
-
- NSError *inputError;
- self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:&inputError];
-
- if (inputError) {
- NSLog(@"init scanner input error: %@",inputError);
- return;
- }
-
- self.session = [[AVCaptureSession alloc] init];
- [self.session setSessionPreset:AVCaptureSessionPresetHigh];
- if ([self.session canAddInput:self.input]) {
- [self.session addInput:self.input];
- } else {
- NSLog(@"init scanner can't add input");
- return;
- }
-
- self.output = [[AVCaptureMetadataOutput alloc] init];
- [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
-
- if ([self.session canAddOutput:self.output]) {
- [self.session addOutput:self.output];
- } else {
- NSLog(@"init scanner can't add output");
- return;
- }
- self.output.metadataObjectTypes = @[
- AVMetadataObjectTypeQRCode,
- AVMetadataObjectTypeEAN13Code,
- AVMetadataObjectTypeEAN8Code,
- AVMetadataObjectTypeUPCECode,
- AVMetadataObjectTypeCode39Code,
- AVMetadataObjectTypeCode39Mod43Code,
- AVMetadataObjectTypeCode93Code,
- AVMetadataObjectTypeCode128Code,
- AVMetadataObjectTypePDF417Code
- ];
-
- self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
- self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
- [self.previewContainer.layer addSublayer:self.previewLayer];
-
- self.scannerInitial = YES;
- }
- #pragma mark - AVCaptureMetadataOutputObjectsDelegate
- - (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
-
- if (!self.scannerEnable) {
- return;
- }
-
- if ([metadataObjects count] > 0) {
- [self.session stopRunning];
-
- AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects objectAtIndex:0];
- NSString *codeValue = metadataObject.stringValue;
- if (self.completion) {
- self.completion(codeValue);
- }
- [self.navigationController popViewControllerAnimated:YES];
- }
-
- }
- #pragma mark - Action
- - (IBAction)scannerBtnTouchDown:(UIButton *)sender {
- self.scannerEnable = YES;
- }
- - (IBAction)scannerBtnTouchUp:(UIButton *)sender {
- self.scannerEnable = NO;
- }
- - (IBAction)scannerBtnTouchUpOutSide:(UIButton *)sender {
- self.scannerEnable = NO;
- }
- - (IBAction)scannerBtnTouchCancel:(UIButton *)sender {
- self.scannerEnable = NO;
- }
- @end
|