iOS7에서 QR코드 스캔

1852 단어
NSError *error;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

if (error)
{
    NSLog(@"%@", [error domain]);
    return;
}

self.captureSession = [[AVCaptureSession alloc] init];
[self.captureSession addInput:input];

AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
[self.captureSession addOutput:captureMetadataOutput];
    
[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[layer setFrame:self.view.layer.bounds];
[self.view.layer addSublayer:layer];
self.videoPreviewLayer = layer;

[self.captureSession startRunning];

모든 것이 순조롭고 스캐닝의 효율이 매우 높다.
그런데 문제가 하나 생겼어요. 저는 스크린의 작은 상자에서만 스캔하고 싶어요. 전체 스크린에서 스캔할 수 있는 것이 아니라 위챗의 효과와 비슷해요.
문서를 보니 AVCaptureMetadataOutput 클래스에 rectOfInterest 속성이 있습니다.
rectOfInterest의 기본값은 CGRectMake(0,0,1,1)
0과 1은 화면에 비례하는 것이지 구체적인 수치가 아니다.
그리고 x와 y,width와height의 위치가 바뀌었다.
코드 추가:
CGRect lensRect = self.lensView.frame;

CGFloat screenW = ScreenSize.width;
CGFloat screenH = ScreenSize.height;
CGRect rectInterest = CGRectMake(CGRectGetMinY(lensRect) / screenH,
                                 ((screenW-CGRectGetWidth(lensRect)))/2/screenW,
                                 CGRectGetHeight(lensRect) / screenH,
                                 CGRectGetWidth(lensRect) / screenW);

[captureMetadataOutput setRectOfInterest:rectInterest];

대성공!

좋은 웹페이지 즐겨찾기