//参照别人的教程的作业贴
这里比较关键的是对扫码作用范围的确定,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];Demo在此: https://github.com/tianNanYiHao/saoOrangeCode
