//参照别人的教程的作业贴
记录一下注意点
扫码的主要原生代码如下
这里比较关键的是对扫码作用范围的确定,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"];