1. 程式人生 > >iOS二維碼的掃描 全屏顯示區域性掃描

iOS二維碼的掃描 全屏顯示區域性掃描

參考網址

http://www.jianshu.com/p/3fb24fc7b415

全屏顯示區域性掃描一直有問題 設定RectOfInterest也有問題,方法走,就是效果達不到 發現新增要寫在 中間

    [self.view.layer insertSublayer:_preview atIndex:0];

    [self updateLayout];

    [_session startRunning];


- (void)defaultConfig {

_device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo

];

// Input

_input = [AVCaptureDeviceInputdeviceInputWithDevice:self.deviceerror:nil];

// Output

_output = [[AVCaptureMetadataOutputalloc]init];

    [_outputsetMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];

// Session

_session = [[AVCaptureSessionalloc]init];

    [_sessionsetSessionPreset

:AVCaptureSessionPresetHigh];

if ([_sessioncanAddInput:self.input])

    {

        [_session addInput:self.input];

    }

if ([_sessioncanAddOutput:self.output])

    {

        [_session addOutput:self.output];

    }

    AVCaptureConnection *outputConnection = [_output connectionWithMediaType

:AVMediaTypeVideo];

    outputConnection.videoOrientation = [QRUtilvideoOrientationFromCurrentDeviceOrientation];

//條形碼二維碼都支援

_output.metadataObjectTypes = @[AVMetadataObjectTypeEAN13Code,

                                    AVMetadataObjectTypeEAN8Code,

                                    AVMetadataObjectTypeCode128Code,

                                    AVMetadataObjectTypeQRCode];

//只支援二維碼

//  _output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

// Preview

_preview =[AVCaptureVideoPreviewLayerlayerWithSession:_session];

_preview.videoGravity =AVLayerVideoGravityResize;

_preview.frame =[QRUtilscreenBounds];

[self.view.layer insertSublayer:_preview atIndex:0];

    [self updateLayout];

_preview.connection.videoOrientation = [QRUtil videoOrientationFromCurrentDeviceOrientation];

  [_session startRunning];

}


- (void)updateLayout {

    _qrView.center = CGPointMake([QRUtil screenBounds].size.width / 2, [QRUtil screenBounds].size.height / 2);

//修正掃描區域

CGFloat screenHeight = self.view.frame.size.height;

CGFloat screenWidth = self.view.frame.size.width;

    CGRect cropRect = CGRectMake((screenWidth - self.qrView.transparentArea.width) / 2,

                                 (screenHeight - self.qrView.transparentArea.height) / 2,

                                 self.qrView.transparentArea.width,

                                 self.qrView.transparentArea.height);

//  設定AVCaptureMetadataOutput  rectOfInterest 的屬性就可以了   這樣設定就可以:CGRectMakey的起點/螢幕的高,x的起點/螢幕的寬,掃描的區域的高/螢幕的高,掃描的區域的寬/螢幕的寬)

    [_output setRectOfInterest:CGRectMake(cropRect.origin.y / screenHeight,

                                          cropRect.origin.x / screenWidth,

                                          cropRect.size.height / screenHeight,

                                        cropRect.size.width / screenWidth)];

}