2013-09-25 10 views
15

Próbuję zaimplementować skaner QRCode z nowymi funkcjami iOS 7, ale mój kod nie wywołuje głównej metody AVCaptureMetadataOutputObjectsDelegate.Przenoszenie uczestnika iOS 7 AVCaptureMetadataOutput (skaner QRCode)

Używałem kamery AVFoundation przed iz moim obecnym realizacji Mam warstwę uruchomiony podgląd bez problemu. Nawet przełączenie wyjścia z powrotem na AVCaptureVideoDataOutput sprawdza poprawność konfiguracji sesji.

Używam tego NSHipster post jako wytyczna i tu jest mój kod do tej pory:

Interfejs:

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

Delegat Metoda:

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

Każda pomoc jest bardzo doceniana!

Odpowiedz

35

Próbuję to sobie wyobrazić. documentation wydaje się mówić, że jeśli nie ustawisz typów w metadataObjectTypes, nie otrzymasz żadnych połączeń. Ale tylna kamera mojego iPada Mini zwraca pustą tablicę dla availableMetadataObjectTypes. Daj nam znać, co wymyślisz.

Edit:

prostu zorientowali się, że jeśli dodać obiekt AVCaptureMetadataOutput do sesji, availableMetadataObjectTypes zostaje wypełnione i można dodać detektor kodu kreskowego do niego. Następnie delegat captureOutput będzie sprawdzony, tak jak to:

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

Bravo panie! Dodatkowe nagrody za bycie takim szybkim uczniem. Przewiduję, że wielu programistów uzna twoją odpowiedź za bardzo użyteczną, gdy będą bardziej zaangażowani w nowe funkcje iOS 7. –

+0

To miało sens, gdy pomyślałem o tym - metadane oczywiście nie mogą być poznane, dopóki obiekt metadanych nie zostanie skojarzony z urządzeniem. –

+4

kładę trochę przykładowy projekt na github jeśli ktoś jest zainteresowany: https://github.com/kpmiller/ios7-barcode –

1

iOS 10 spowodował ten sam problem dla mnie. Aktualnie mam wydaną wersję deweloperską na WWDC 2016. Kiedy uruchomiłem aplikację na telefonie z iOS 9, ponownie wywołano metodę captureOutput:didOutputMetadataObjects:.

+0

Sprawdź dostępneMetadataObjectTypes, może być puste na iOS 10 –