2013-09-25 2 views
15

새로운 iOS 7 기능을 갖춘 QRCode 스캐너를 구현하려고하지만 내 코드가 AVCaptureMetadataOutputObjectsDelegate 메인 메서드를 호출하지 않습니다.iOS 7 AVCaptureMetadataOutput 델리게이트 (QRCode 스캐너)

저는 현재 구현중인 AVFoundation 카메라를 사용했으며 문제없이 미리보기 레이어를 실행했습니다. 내 출력을 AVCaptureVideoDataOutput으로 다시 전환해도 내 세션 설정이 유효한지 확인할 수 있습니다. 내가 여기에이 지침으로 NSHipster post 등을 사용하고

지금까지 내 코드입니다 :

인터페이스 :

@import AVFoundation; 

@interface QRCodeViewController() <AVCaptureMetadataOutputObjectsDelegate> 

@property (strong, nonatomic) AVCaptureDevice* device; 
@property (strong, nonatomic) AVCaptureDeviceInput* input; 
@property (strong, nonatomic) AVCaptureMetadataOutput* output; 
@property (strong, nonatomic) AVCaptureSession* session; 
@property (strong, nonatomic) AVCaptureVideoPreviewLayer* preview; 

@end 

설정 :

- (void)setupCamera 
{ 
    // Device 
    self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    // Input 
    self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; 

    // Output 
    self.output = [[AVCaptureMetadataOutput alloc] init]; 
    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 

    // Session 
    self.session = [[AVCaptureSession alloc] init]; 
    [self.session addInput:self.input]; 
    [self.session addOutput:self.output]; 

    // Preview 
    self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session]; 
    self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    self.preview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 
    [self.view.layer insertSublayer:self.preview atIndex:0]; 

    // Start 
    [self.session startRunning]; 
} 

위임 방법 :

// DELEGATE METHOD NOT CALLED 
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection 
{ 
    NSLog(@"Metadata"); 
} 

모든 도움을 주시면 감사하겠습니다.

답변

35

나는 이것을 스스로 이해하려고 노력하고 있습니다. documentation은 metadataObjectTypes에 원하는 유형을 설정하지 않으면 호출이 발생하지 않는다고합니다. 하지만 내 iPad Mini의 후면 카메라는 availableMetadataObjectTypes에 대해 빈 배열을 반환합니다. 우리가 당신이 알아 낸 것을 알려주십시오.

편집 :

난 그냥 당신이 세션에 AVCaptureMetadataOutput 개체를 추가하면 availableMetadataObjectTypes가에 채워집니다 그리고 당신이 그것에 바코드 검출기를 추가 할 수 있음을 알아 냈다. 그런 다음 captureOutput 위임은 그래서 다음과 같이 전화를받을 것이다 :

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init]; 
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 
[session addOutput:output]; 
output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode]; 
+1

브라보! 그런 빠른 자기 학습자 인 것에 대한 여분의 명성. 나는 많은 개발자들이 새로운 iOS 7 기능에 더 많이 관여하게되면 매우 유용한 답변을 찾을 것으로 기대합니다. –

+0

한번 생각해 보면 이해할 수 있습니다. 메타 데이터 개체가 장치와 연결될 때까지는 메타 데이터를 분명히 알 수 없습니다. –

+4

관심이있는 사람이라면 작은 샘플 프로젝트를 github에 넣을 수 있습니다. https://github.com/kpmiller/ios7-barcode –

1

아이폰 OS (10) 나를 위해 동일한 문제가 발생합니다. 현재 WWDC 2016에서 개발자 버전이 출시되었습니다. iOS 9가 설치된 휴대 전화에서 앱을 실행하면 captureOutput:didOutputMetadataObjects: 메서드가 다시 호출되었습니다.

+0

availableMetadataObjectTypes를 확인하십시오. iOS 10에서는 비어있을 수 있습니다. –

관련 문제