2013-09-25 27 views
15

Tôi đang cố gắng triển khai máy quét QRCode với các tính năng iOS 7 mới nhưng mã của tôi không gọi phương thức chính là AVCaptureMetadataOutputObjectsDelegate.iOS 7 AVCaptureMetadataOutput delegate (Trình quét QRCode)

Tôi đã sử dụng máy ảnh AVFoundation trước và với triển khai hiện tại của tôi, tôi đã có lớp xem trước đang chạy mà không gặp sự cố. Ngay cả khi chuyển đầu ra của tôi trở lại thành AVCaptureVideoDataOutput xác thực cài đặt phiên của tôi.

Tôi đang sử dụng NSHipster post này làm kim chỉ nam và đây là mã của tôi cho đến nay:

Interface:

@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 

Setup:

- (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]; 
} 

Đại biểu Phương pháp:

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

Bất kỳ trợ giúp nào được đánh giá cao!

Trả lời

35

Tôi đang cố gắng tìm ra điều này. documentation dường như nói rằng nếu bạn không đặt loại (s) bạn muốn trong metadataObjectTypes, bạn sẽ không nhận được bất kỳ cuộc gọi nào. Nhưng máy ảnh sau của iPad Mini trả về một mảng trống cho availableMetadataObjectTypes. Hãy cho chúng tôi biết những gì bạn tìm ra.

Edit:

tôi chỉ ra rằng nếu bạn thêm các đối tượng AVCaptureMetadataOutput đến phiên giao dịch, các availableMetadataObjectTypes được lấp đầy trong và bạn có thể thêm các máy dò mã vạch với nó. Sau đó, các đại biểu captureOutput sẽ được gọi, vì vậy như thế này:

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

Bravo sir! Kudos bổ sung để trở thành một người tự học nhanh như vậy. Tôi dự đoán nhiều nhà phát triển sẽ thấy câu trả lời của bạn rất hữu ích khi họ tham gia nhiều hơn với các tính năng mới của iOS 7. –

+0

Nó có ý nghĩa một khi tôi nghĩ về nó - siêu dữ liệu rõ ràng là không thể được biết đến cho đến khi đối tượng siêu dữ liệu được kết hợp với thiết bị. –

+4

Tôi đặt dự án mẫu nhỏ của tôi trên github nếu có ai quan tâm: https://github.com/kpmiller/ios7-barcode –

1

iOS 10 gây ra vấn đề tương tự cho tôi. Tôi hiện đang có phiên bản dành cho nhà phát triển được phát hành tại WWDC 2016. Khi tôi chạy ứng dụng trên điện thoại có iOS 9, phương thức captureOutput:didOutputMetadataObjects: đã được gọi lại.

+0

Kiểm tra availableMetadataObjectTypes, nó có thể trống trên iOS 10 –

Các vấn đề liên quan