2013-09-25 7 views
15

Sto cercando di implementare uno scanner QRCode con le nuove funzionalità di iOS 7 ma il mio codice non chiama il metodo principale AVCaptureMetadataOutputObjectsDelegate.iOS 7 AVCaptureMetadataOutput delegate (scanner QRCode)

Ho usato la videocamera AVFoundation prima e con la mia attuale implementazione ho il livello di anteprima in esecuzione senza problemi. Anche riportare la mia uscita su AVCaptureVideoDataOutput conferma l'impostazione della mia sessione.

Sto usando questo NSHipster post come linea guida ed ecco il mio codice finora:

Interfaccia:

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

delegato Metodo:

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

Qualsiasi aiuto è molto apprezzato!

risposta

35

Sto cercando di capirlo da solo. Il documentation sembra dire che se non si imposta il tipo (i) che si desidera in metadataObjectTypes, non si otterranno chiamate. Ma la fotocamera posteriore del mio iPad Mini restituisce un array vuoto per i Tipi disponibiliMetadataObject. Facci sapere cosa trovi.

Edit:

ho appena capito che se si aggiunge l'oggetto AVCaptureMetadataOutput alla sessione, i availableMetadataObjectTypes si riempie in ed è possibile aggiungere il rilevatore di codici a barre ad esso. Poi il delegato captureOutput verrà chiamato, in modo simile a questo:

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

Bravo signore! Complimenti extra per essere un autodidatta così veloce. Prevedo che molti sviluppatori troveranno la tua risposta molto utile una volta che saranno maggiormente coinvolti con le nuove funzionalità di iOS 7. –

+0

Aveva senso una volta che ci pensavo - i metadati ovviamente non possono essere conosciuti fino a quando l'oggetto metadati non viene associato al dispositivo. –

+4

Ho inserito il mio piccolo progetto di esempio su github se qualcuno fosse interessato: https://github.com/kpmiller/ios7-barcode –

1

iOS 10 causato lo stesso problema per me. Al momento ho l'edizione per sviluppatori rilasciata al WWDC 2016. Quando ho eseguito l'app su un telefono con iOS 9, è stato richiamato il metodo captureOutput:didOutputMetadataObjects:.

+0

Verifica disponibileMetadataObjectTypes, può essere vuoto su iOS 10 –