iOS 7 AVCaptureMetadataOutput委托(QRCode扫描仪) [英] iOS 7 AVCaptureMetadataOutput delegate (QRCode scanner)
问题描述
我正在尝试使用新的iOS 7功能实现QRCode扫描程序,但我的代码没有调用主 AVCaptureMetadataOutputObjectsDelegate
方法。
I'm trying to implement a QRCode scanner with the new iOS 7 features but my code isn't calling the main AVCaptureMetadataOutputObjectsDelegate
method.
之前我使用过AVFoundation相机并使用我当前的实现我已经预览层运行没有问题。甚至将我的输出切换回 AVCaptureVideoDataOutput
验证我的会话设置。
I've used the AVFoundation camera before and with my current implementation I've got the preview layer running without a problem. Even switching my output back to AVCaptureVideoDataOutput
validates my session setup.
我正在使用此NSHipster的帖子作为指南,这是我的代码到目前为止:
I'm using this NSHipster post as a guideline and here's my code so far:
界面:
@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");
}
非常感谢任何帮助!
推荐答案
我想弄清楚自己。 文档似乎说如果你没有在metadataObjectTypes中设置你想要的类型,你将不会得到任何调用。但我的iPad Mini的后置摄像头为availableMetadataObjectTypes返回一个空数组。让我们知道你的想法。
I am trying to figure this out myself. The documentation seems to say that if you don't set the type(s) you want in metadataObjectTypes, you won't get any calls. But my iPad Mini's back camera returns an empty array for availableMetadataObjectTypes. Let us know what you figure out.
编辑:
我只是想通了,如果你添加了AVCaptureMetadataOutput对象到会话,可以填充availableMetadataObjectTypes,您可以添加条形码检测器。然后将调用captureOutput委托,如下所示:
I just figured out that if you add the AVCaptureMetadataOutput object to the session, the availableMetadataObjectTypes gets filled in and you can add the barcode detector to it. Then the captureOutput delegate will get called, so like this:
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
这篇关于iOS 7 AVCaptureMetadataOutput委托(QRCode扫描仪)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!