[iOS 原生代码实现扫描二维码/条形码] AVCaptureDevice

[iOS 原生代码实现扫描二维码/条形码] AVCaptureDevice_第1张图片

//参照别人的教程的作业贴

记录一下注意点

扫码的主要原生代码如下

这里比较关键的是对扫码作用范围的确定,metdataOutput.rectOfInterest 如果不设置,那么默认就是全屏都是作用域.如果设置,那么需要注意,它的作用范围不是具体的CGpoint点,而是范围比例,因此要在width/height上除以实际的屏幕宽高,最后也是最重要的一点就是,机器设备扫码时,是默认工作状态为横屏的 也就是说 你的扫码框的原点由左上角->变为了右上角, 只要你交换一下x/y 的点和宽高 ,就可以获取正确的作用域(如果扫码框是正方形的更好)

   //1.获取摄像设备
    avDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    //2.创建输入流
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:avDevice error:nil];

    //3.创建输出流
    AVCaptureMetadataOutput *metdataOutput = [[AVCaptureMetadataOutput alloc] init];
    //设置代理 在主线程刷新
    [metdataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    //3.1 设置扫码框作用范围 (由于扫码时系统默认横屏关系, 导致作用框原点变为我们绘制的框的右上角,而不是左上角) 且参数为比率不是像素点
    metdataOutput.rectOfInterest = CGRectMake(scanContent_Y/layerBounds.size.height, scanContent_X/layerBounds.size.width, (layerBounds.size.width - 2 * scanContent_X)/layerBounds.size.height, (layerBounds.size.width - 2 * scanContent_X)/layerBounds.size.width);


    //4.初始化连接对象
    avSession = [[AVCaptureSession alloc] init];
    //设置高质量采集率
    [avSession setSessionPreset:AVCaptureSessionPresetHigh];
    //组合
    [avSession addInput:input];
    [avSession addOutput:metdataOutput];


    //设置扫码格式支持的码(一定要在 session 添加 addOutput之后再设置 否则会爆)
    metdataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code];
    //展示layer
    AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:avSession];
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    layer.frame = self.layer.bounds;
    [self.layer insertSublayer:layer atIndex:0];

    [avSession startRunning];

第二个注意的动画位移问题

   // line移动的范围为 一个扫码框的高度(由于图片问题再减去图片的高度)
    CABasicAnimation * lineAnimation = [self animationWith:@(0) toValue:@(scanContent_layerH - lineimgViewH) repCount:MAXFLOAT duration:1.5f];
    [lineImgView.layer addAnimation:lineAnimation forKey:@"LineImgViewAnimation"];

Demo在此:
https://github.com/tianNanYiHao/saoOrangeCode

你可能感兴趣的:(#,iOS,动画,#,iOS,绘图,动画,#,iOS,自定义控件,#,iOS,扫码二维码,#,iOS,拍照上传问题)