iOS 7 AVCaptureMetadataOutput delegate(QRCode scanner)
avfoundation ios7 (2)
Estoy tratando de resolver esto yo mismo. La documentación parece indicar que si no establece los tipos que desea en metadataObjectTypes, no recibirá ninguna llamada. Pero la cámara trasera de mi iPad Mini devuelve una matriz vacía de MetadataObjectTypes disponibles. Háganos saber lo que averigua.
Editar:
Acabo de descubrir que si agrega el objeto AVCaptureMetadataOutput a la sesión, los MetadataObjectTypes disponibles se completan y puede agregarle el detector de código de barras. A continuación, se llamará al delegado captureOutput, así que así:
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
Estoy tratando de implementar un escáner QRCode con las nuevas características de iOS 7, pero mi código no está llamando al método principal AVCaptureMetadataOutputObjectsDelegate
.
He usado la cámara AVFoundation anteriormente y con mi implementación actual tengo la capa de vista previa ejecutándose sin problemas. Incluso cambiando mi salida a AVCaptureVideoDataOutput
valida la configuración de mi sesión.
Estoy usando esta publicación de NSHipster como guía y aquí está mi código hasta ahora:
Interfaz:
@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
Preparar:
- (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];
}
Método de delegado:
// DELEGATE METHOD NOT CALLED
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
NSLog(@"Metadata");
}
¡Cualquier ayuda es muy apreciada!
iOS 10 me causó el mismo problema. Actualmente tengo la edición de desarrollador lanzada en WWDC 2016. Cuando ejecuté la aplicación en un teléfono con iOS 9, se llamó nuevamente al método captureOutput:didOutputMetadataObjects:
.