2013-09-25 3 views
15

J'essaie d'implémenter un scanner QRCode avec les nouvelles fonctionnalités iOS 7 mais mon code n'appelle pas la méthode principale AVCaptureMetadataOutputObjectsDelegate.iOS 7 Délégué AVCaptureMetadataOutput (scanner QRCode)

J'ai utilisé la caméra AVFoundation avant et avec ma mise en œuvre actuelle j'ai la couche de prévisualisation en cours d'exécution sans problème. Même la commutation de ma sortie vers AVCaptureVideoDataOutput valide ma configuration de session.

J'utilise ce NSHipster post comme ligne directrice et voici mon code jusqu'à présent:

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 

Configuration:

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

Délégué Méthode:

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

Toute aide est grandement appréciée!

Répondre

35

J'essaie de comprendre cela moi-même. Le documentation semble dire que si vous ne définissez pas le (s) type (s) que vous voulez dans metadataObjectTypes, vous n'obtiendrez aucun appel. Mais la caméra arrière de mon iPad Mini renvoie un tableau vide pour availableMetadataObjectTypes. Faites-nous savoir ce que vous comprenez.

Edit:

Je viens de comprendre que si vous ajoutez l'objet AVCaptureMetadataOutput à la session, les availableMetadataObjectTypes suiveront et vous pouvez ajouter le détecteur de codes-barres à lui. Ensuite, le délégué captureOutput sera appelé, donc comme ceci:

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

Bravo monsieur! Bravo supplémentaire d'être un auto-apprenant si rapide. Je prévois que de nombreux développeurs trouveront votre réponse très utile une fois qu'ils seront plus impliqués avec les nouvelles fonctionnalités d'iOS 7. –

+0

C'était logique une fois que j'y pensais - les métadonnées ne peuvent évidemment pas être connues jusqu'à ce que l'objet de métadonnées soit associé à l'appareil. –

+4

J'ai mis mon petit exemple de projet sur github si quelqu'un est intéressé: https://github.com/kpmiller/ios7-barcode –

1

iOS 10 causé le même problème pour moi. J'ai actuellement l'édition du développeur publié à la WWDC 2016. Lorsque j'ai couru l'application sur un téléphone avec iOS 9, la méthode captureOutput:didOutputMetadataObjects: a été appelée à nouveau.

+0

Vérifiez disponibleMetadataObjectTypes, il peut être vide sur iOS 10 –